我正在try 在我的应用程序中使用Angularjs框架和turbolinks.页面更改后,它不会初始化新的eventlisteners.有没有办法让它发挥作用?提前谢谢!

推荐答案

AngularJS vs.Turbolinks

TurbolinksAnguluarJS都可以用于使web应用程序更快地响应,这意味着响应用户交互时,网页上会发生一些事情,而无需重新加载和重新呈现整个页面.

它们在以下方面有所不同:

  • AngularJS帮助您构建rich client-side application,在这里您可以编写大量在客户机上运行的JavaScript代码.此代码使网站与用户交互.它使用JSON API与服务器端后端通信,即与Rails应用程序通信.

  • 另一方面,Turbolinks有助于使网站具有交互性,而无需编写JavaScript代码.它允许您在服务器端运行stick to the Ruby/Rails code,但仍然"神奇地"使用AJAX替换页面中已更改的部分,并因此重新呈现.

当Turbolinks强大到可以让你不用手工编写Ruby/Rails代码就可以使用这种强大的AJAX机制时,随着应用程序的发展,你可能会想要集成一个JavaScript框架,比如AngularJS.

尤其是在这个中间阶段,您希望将AngularJS连续集成到应用程序中,一次集成一个组件,将AngularJS和Turbolinks一起运行是非常有意义的.

如何同时使用AngularJS和TurboLink

使用回调手动 bootstrap

在Angular代码中,有一行定义了应用程序模块,如下所示:

# app/assets/javascripts/angular-app.js.coffee
# without turbolinks
@app = angular.module 'MyApplication', ['ngResource']

此代码在加载页面时运行.但由于Turbolinks只是替换了页面的一部分,并阻止了整个页面的加载,因此您必须确保angular应用程序已正确初始化(" bootstrap "),即使Turbolinks完成了部分重新加载.因此,用以下代码替换上述模块声明:

# app/assets/javascripts/angular-app.js.coffee
# with turbolinks
@app = angular.module 'MyApplication', ['ngResource']

$(document).on 'turbolinks:load', ->
  angular.bootstrap document.body, ['MyApplication']

不要自动 bootstrap

在教程中,您经常会看到如何在HTML代码中使用ng-app属性自动 bootstrap Angular应用程序.

<!-- app/views/layouts/my_layout.html.erb -->
<!-- without turbolinks -->
<html ng-app="YourApplication">
  ...

但是,如果将此机制与上面显示的手动 bootstrap 一起使用,则会导致应用程序 bootstrap 两次,因此会阻止应用程序.

因此,只需删除这个ng-app属性:

<!-- app/views/layouts/my_layout.html.erb -->
<!-- with turbolinks -->
<html>
  ...

进一步阅读

Ruby-on-rails相关问答推荐

HTTP:MimeNegotiation::InvalidType(html不是有效的MIME类型):""

使用Hotwire/Turbo的Rails在链接悬停时获取请求

通过激励控制器正确更新Turbo帧信源

Rails turbo流只更新页面上的一个元素

GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用

Rails 3 的data-method='delete'如何优雅地降级?

Rails 上的 build 和 new 有什么区别?

如何使用 Capistrano gem 为生产数据库 seeder ?

使用 ActiveRecord 3 / Arel 查找单个记录的最佳方法?

Ruby 元素是否存在于数组中

如何按值按降序对哈希进行排序并在 ruby​​ 中输出哈希?

如何从邮箱中获取域

使用 Rails 时,在 Ruby 中处理常量的最佳方法是什么?

我如何在具有活动记录的 Rails 中使用两个不同的数据库?

Rails:如何修复‘生产’环境缺少 secret_key_base

何时使用 Helpers 而不是 Partials

has_many :通过 class_name 和 foreign_key

活动管理员:仅自定义新表单

您可以在弹性 beantalk 环境中运行 rails 控制台或 rake 命令吗?

如何获取 Rails 3.1 中assets资源 的绝对 URL?