AngularJS 与 Turbolinks
Turbolinks 和 AnguluarJS 都可以用来使 Web 应用程序响应更快,因为响应用户交互,网页上会发生一些事情无需重新加载和重新呈现整个页面。
它们在以下方面有所不同:
AngularJS 可帮助您构建富客户端应用程序,您可以在其中编写大量运行在客户端计算机上的 JavaScript 代码。此代码使站点与用户交互。它使用 JSON API 与服务器端后端(即 Rails 应用程序)进行通信。
另一方面,Turbolinks 有助于使网站具有交互性,而无需您编写 JavaScript 代码。它允许您坚持使用在服务器端运行的 Ruby/Rails 代码,并且仍然“神奇地”使用 AJAX 替换并因此仅重新呈现已更改的页面部分。
Turbolinks 的强大之处在于允许您使用这种强大的 AJAX 机制而无需手动执行任何操作,只需编写 Ruby/Rails 代码,随着您的应用程序的增长,您可能会想要集成 JavaScript 框架,例如 AngularJS .
特别是在这个中间阶段,您希望将 AngularJS 连续集成到您的应用程序中,一次一个组件,将 Angular JS 和 Turbolinks 一起运行是非常有意义的。
如何同时使用 AngularJS 和 Turbolinks
使用回调手动引导 Angular
在您的 Angular 代码中,您有一行定义您的应用程序模块,如下所示:
# app/assets/javascripts/angular-app.js.coffee
# without turbolinks
@app = angular.module 'MyApplication', ['ngResource']
此代码在页面加载时运行。但是由于 Turbolinks 只是替换了页面的一部分并阻止了整个页面的加载,因此您必须确保 angular 应用程序已正确初始化(“引导”),即使在 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 属性自动引导 Angular 应用程序。
<!-- app/views/layouts/my_layout.html.erb -->
<!-- without turbolinks -->
<html ng-app="YourApplication">
...
但是将这种机制与上面显示的手动引导一起使用会导致应用程序引导两次,因此会导致应用程序停止。
因此,只需删除此ng-app 属性:
<!-- app/views/layouts/my_layout.html.erb -->
<!-- with turbolinks -->
<html>
...
进一步阅读