适当的“Rails”方式在特定页面上执行javascript
我试图在特定页面上运行javascript,我唯一的解决方案似乎是反模式。 我在assets/javascripts/
生成了controller.js
。 我正在使用gem 'jquery-turbolinks'
我的代码类似于以下内容:
$(document).ready(function () { //Initiate DataTables ect.. } )
此代码在每个页面上触发,因此我在其中添加了以下内容。
if ($('#page-specific_element').length > 0) { //Initiate Datatables ect. }
我的问题是,有没有办法设置rails只使用特定控制器所需的javascript文件或逻辑门控元素搜索最佳解决方案?
这是一个非常好的turbolinks特定解决方案:
// Instead of listening for document ready $(document).on('users#show:loaded', function(){ $('#logger').append('Users Show action loaded '); }); // Instead of listening for document ready $(document).on('users:loaded', function(){ $('#logger').append('Some users controller method loaded '); }); // Turbolinks fires "page:change" when it changes the page content. // you could change this to just document ready if you are not using // turbolinks. $(document).on("page:change", function(){ var data = $('body').data(); $(document).trigger(data.controller + ':loaded'); $(document).trigger(data.controller + '#' + data.action + ':loaded'); }); // This is just for demonstration purposes... $(document).trigger("page:change");
有很多方法可以做到这一点。 我会形容一个。
我使用这个旧的gem来包装commonjs模块中的所有.module.js
文件。
然后我有一个帮助器,它将类似下面的内容写入每个HTML页面头部的标记。
posts/create
是从当前控制器和呈现请求的动作的简化混合生成的。
然后我在我的application.js
为我的application.js
提供了类似下面的内容。
try { App.pageModule = require(App.pageModule); } catch(e) { console.log('%c' + e, 'color:red; background-color:yellow'); } if (_.isPlainObject(App.pageModule) && _.has(App.pageModule, 'initialize')) { App.pageModule.initialize(); }
最后,我将有一个这样的文件,特定于/posts/create
URL。
应用程序/资产/职位/ create.module.js
module.exports = { initialize: function() { // data-tables stuff here... } }