Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Rails 5管理javascript/coffeescript代码的有效方法?_Javascript_Jquery_Ruby On Rails_Ruby On Rails 5_Asset Pipeline - Fatal编程技术网

为Rails 5管理javascript/coffeescript代码的有效方法?

为Rails 5管理javascript/coffeescript代码的有效方法?,javascript,jquery,ruby-on-rails,ruby-on-rails-5,asset-pipeline,Javascript,Jquery,Ruby On Rails,Ruby On Rails 5,Asset Pipeline,我正在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); }

我正在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.js用于page/company,它将在第一页执行,比如说/home。当我转到/company时,company.js中编写的行将不会再次执行。因此,我必须使用turbolinks:load事件侦听器,并将每个UI初始化和UI附加的事件封装在一个方法中,以便在turbolinks:load和普通调用中调用。(如代码段所示)


  • 所以,我想知道rails开发人员对于js资产,特别是使用rails 5的人,遵循什么实践?如果您的回答能解决我上面提到的问题,那将非常有帮助。

    在回答您的问题时:

  • 视情况而定。我建议您首先尝试默认设置——它只要求您严格遵守选择器和类名的规定。但是,如果您发现自己在每个页面上都包含了大量的js,并且只在一个后端页面上使用,那么请参见下面的其他可能性
  • 是的,只需使用特定于目标资源的类名,如.comments\u表单,如果在页面上找不到该类名,则每个函数中的js可以提前退出(因此您知道该页面不相关)
  • 您应该编写js,使其仅在页面加载后触发,这样,每次页面加载都会触发一次—无需两个init()调用,只要在加载文档时总是触发,或者在turbolinks中,在turbolinks:load上总是触发。即使不使用turbolinks或rails,这实际上也是一个很好的实践,因为您希望在js启动之前加载并初始化页面 您应该能够使用rails 5:

    document.addEventListener("turbolinks:load", function() {
        console.log('Loads each time');
    });
    
    见文件:

    这里有一个权衡。您可以将特定于页面的js包含在内联或许多单独的文件中,但浏览器必须对其发出另一个请求,并且可能不会将其包含在缓存中。Rails选择保持简单,并假设每个页面缓存一个文件比整个站点上50个不同的js文件要好。YMMV但这似乎工作得很好,所以我先试试Rails方法

    如果您觉得不方便的话,您可以通过各种方式来处理Rails设置。我建议将大部分js放在一个组中,但您也可以(按照复杂性的顺序):

  • 将大多数js保留在主文件中,但将一些js内联到只与该页面相关的页面上
  • 在页面标题中导入特定于页面的静态js文件(例如,仅在后端屏幕上的文本编辑器组件的js)
  • 将js拆分为资产组,并仅在某些页面上导入某些组-有关详细信息,请参阅此答案
    我关心的一点是“不需要两个init()调用”。我已经测试过,如果您刷新页面或通过直接URL打开页面,turbolinks:load中包装的任何内容都不会执行。