我正在 Rails 5.0.2 中构建一个 Web 应用程序。我的项目有以下 JS 文件:
此外,我自己的每个 JS 文件都有类似的模式,如下所示:
$(function () {
var init = function () {
// my code, I want to run on specific page load i.e. /remarks
$('form#cf_remarks_form').validate(validate_options);
};
init();
document.addEventListener("turbolinks:load", function () {
init();
});
});
我对使用 JS 资源有以下保留/疑问:
Rails 默认情况下会附加(并因此运行)所有页面上的所有 js 文件以实现相同的布局。使用自定义模式在特定资源/页面上仅添加相关js好还是使用默认好?
如果所有 js 组合并链接到每个页面,我在使用 jQuery 选择器时需要非常具体/谨慎,因为如果我有一个页面的选择 $('div.custom input.no-search') 可能会让我发疯另一个页面中有很多代码和限定标签,我不想在其上运行方法,提到的选择器正在选择。
Rails 5 使用 ajax 加载普通页面。如果页面/company有一个文件company.js,它将在第一页(例如/home)上执行。当我转到 /company 时,company.js 中编写的行将不会再次执行。因此,我必须使用 Turbolinks:load 事件侦听器,并将每个 UI 初始化和 UI 附加事件封装在一个方法中,以便在 Turbolinks:load 以及正常调用时调用。 (如代码片段所示)
那么,我想知道 Rails 开发人员对于 js 资产遵循什么实践,特别是使用 Rails 5 的人?如果您的回答解决了我上面提到的问题,那将会有很大的帮助。
回答您的问题:
您应该能够将其与 Rails 5 一起使用:
document.addEventListener("turbolinks:load", function() {
console.log('Loads each time');
});
请参阅文档:
http://guides.rubyonrails.org/working_with_javascript_in_rails.html#turbolinks
这里需要权衡。您可以内联或在许多单独的文件中包含特定于页面的 js,但浏览器必须对其发出另一个请求,并且可能不会在缓存中包含它。 Rails 选择让事情变得简单,并假设为每个页面缓存一个文件比站点上 50 个不同的 js 文件要好。 YMMV 但这似乎确实工作得很好,所以我首先尝试 Rails 方式。
如果您觉得不方便,您可以通过多种方式解决 Rails 设置。我建议将大部分 js 保留在一组中,但您也可以(按复杂程度排序):