将 angularjs 与 Turbolink 一起使用

2024-01-01

我正在尝试在我的应用程序中使用 Angularjs 框架和 Turbolinks。页面更改后,它不会初始化新的事件侦听器。有什么办法让它发挥作用吗?提前致谢!


AngularJS 与 Turbolinks

涡轮链接AngularJS两者都可以用来使 Web 应用程序响应更快,即响应用户交互时,网页上会发生某些事情,而无需重新加载和重新呈现整个页面。

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

  • AngularJS帮助您建立一个丰富的客户端应用程序,您可以在其中编写大量在客户端计算机上运行的 JavaScript 代码。此代码使网站能够与用户交互。它使用 JSON API 与服务器端后端(即 Rails 应用程序)进行通信。

  • 涡轮链接另一方面,有助于使网站具有交互性,而无需您编写 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 只是替换页面的一部分并阻止整个页面加载,因此您必须确保角度应用程序已正确初始化(“引导”),即使在 Turbolinks 完成此类部分重新加载之后也是如此。因此,将上述模块声明替换为以下代码:

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

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

不要自动引导

您经常在教程中看到如何使用以下命令自动引导 Angular 应用程序ng-appHTML 代码中的属性。

<!-- 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>
  ...

进一步阅读

  • AngularJS 引导:http://docs.angularjs.org/guide/bootstrap http://docs.angularjs.org/guide/bootstrap
  • Turbolinks 上的 Railscasts(解释回调):http://railscasts.com/episodes/390-turbolinks http://railscasts.com/episodes/390-turbolinks
  • 演示应用程序:https://github.com/fiedl/rails-5-angular-and-turbolinks-demo https://github.com/fiedl/rails-5-angular-and-turbolinks-demo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 angularjs 与 Turbolink 一起使用 的相关文章

随机推荐