我正在try 在我的应用程序中使用Angularjs框架和turbolinks.页面更改后,它不会初始化新的eventlisteners.有没有办法让它发挥作用?提前谢谢!
我正在try 在我的应用程序中使用Angularjs框架和turbolinks.页面更改后,它不会初始化新的eventlisteners.有没有办法让它发挥作用?提前谢谢!
Turbolinks和AnguluarJS都可以用于使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一起运行是非常有意义的.
在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']
在教程中,您经常会看到如何在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>
...