Jquery 是否可以在不使用require_树的情况下使用TurboLink?
我想在我的应用程序中使用TurboLink,但我不想在application.js中使用'require_tree',原因是我有特定的代码,应该只在特定的控制器中加载 如果我将require_tree从application.js中删除,则根本不会加载任何coffescripts,这会自动使它们变得无用 我很难理解TurboLink是如何工作的,所以如果这是一个非常愚蠢的问题,请原谅我 谢谢 编辑:示例: 我有3个控制器,用户,产品和销售。每个控制器都有自己的.js.coffee文件,其中的代码仅适用于其控制器 users.js.coffee:Jquery 是否可以在不使用require_树的情况下使用TurboLink?,jquery,ruby-on-rails,ruby-on-rails-4,turbolinks,Jquery,Ruby On Rails,Ruby On Rails 4,Turbolinks,我想在我的应用程序中使用TurboLink,但我不想在application.js中使用'require_tree',原因是我有特定的代码,应该只在特定的控制器中加载 如果我将require_tree从application.js中删除,则根本不会加载任何coffescripts,这会自动使它们变得无用 我很难理解TurboLink是如何工作的,所以如果这是一个非常愚蠢的问题,请原谅我 谢谢 编辑:示例: 我有3个控制器,用户,产品和销售。每个控制器都有自己的.js.coffee文件,其中的代码
$ ->
$('#d_table').dataTable
sPaginationType: "bootstrap"
$('[data-behaviour~=datepicker]').datepicker
format: 'dd/mm/yyyy'
products.js.咖啡
$ ->
$('#r_chart').highcharts
chart:
type: 'spline'
$ ->
$("#r_chart").highcharts
chart:
type: "column"
sales.js.咖啡
$ ->
$('#r_chart').highcharts
chart:
type: 'spline'
$ ->
$("#r_chart").highcharts
chart:
type: "column"
如果我在application.js中启用require_tree和turbolinks,会引发一个异常,因为我将两个事件绑定到#r_图表(如预期的那样),但它们排序为“工作”,尽管有很多错误(另一天的情况完全不同)
如果我禁用require_树,但保持turbolinks处于启用状态,则不会加载任何js.coffee文件,因此不会从jQuery触发任何事件
如果禁用require_tree和turbolinks,应用程序将按预期工作。每个控制器单独加载js.coffee文件,调用时触发所有事件
--
我想做的是使用第三种场景,其中启用了turbolinks,但是js.coffee文件是每个控制器单独加载的(而不是使用require\u tree一起加载)。您不需要使用
require\u tree
。您可以要求每个javascript单独使用:
//= require turbolinks
//= require some_other_file
更多
我很难理解TurboLink是如何工作的
是一个Javascript库,旨在提高应用程序的效率:
Turbolinks使web应用程序中的以下链接更快。
而不是让浏览器重新编译JavaScript和CSS
在每次页面更改之间,它将保持当前页面实例处于活动状态,并且
仅替换正文和标题中的标题。想想CGI vs
持久过程
它的工作原理是重新加载网页的
标记,保持
标记不变-限制每次请求和呈现的数据量
Turbolinks的问题是javascript经常失去与DOM
中的元素“绑定”的能力,这意味着您必须使用一些or使JS正常工作:
#app/assets/javascripts/application.js
var your_function = function() {
// ... your functionality
}
$(document).on("page:load ready", your_function);
--
以控制器为中心的资产
如果您想加载以控制器为中心的资产,则TurboLink或require_tree
不会有问题-这将是如何加载所需文件的问题
我建议您在布局中使用以下选项:
#app/views/layouts/application.html.erb
<%= stylesheet_link_tag "application", controller_name, media: "all", "data-turbolinks-track" => true %>
修复 也许您的问题与元素的绑定有关 您正在使用匿名函数在
DOM
load上启动绑定-也许您最好使用来对其进行排序:
#app/assets/javascripts/application.js
var loading = function() {
//highcharts stuff here
}
$(document).on("page:load ready", loading);
对如果您对特定代码有问题,请共享该代码,我们可以提供帮助。该代码并不复杂,但对某些控制器/方法来说非常特殊,因此当我通过jquery将事件绑定到元素时,它们在加载require_树时会引发异常,因为它们只在这些特定的控制器中找到。我将尝试提供一个简单的例子,但这不是真正的问题。我说的是控制器专用的咖啡脚本。这些.js.coffee文件是在没有require_tree的情况下启用TurboLink时不会加载的文件。我明白了,那么解决方案不是
application.js
manifest,因为它的目的是为链轮提供一个文件列表,以便在生产中连接到单个文件中。你需要手动javascript\u在你想要的地方包含标签“specific\u file”
。如果你将脚本放在头部,你可以使用yield:some\u content
和content\u for:some\u content
技术将脚本从你想要的特定控制器动作放在头部。我很困惑。这些文件是每个控制器附带的标准.js.coffee文件,没有创建其他文件。当禁用turbolinks(以及require_tree)时,应用程序将按预期工作,但一旦启用turbolinks,就不会加载任何应用程序。我编辑了我的问题以反映我所说的。我想我已经接近你的建议了。我没有在DOM上绑定它们的问题(我使用的是一个gem来替换我的代码以使用正确的page:load指令),所以这一部分很好。我尝试按照您的建议使用controller_name helper,但出现了一个错误,我认为这是由于没有添加config.assets.precompile造成的。问题是,这个问题只存在于开发中,如果我将它发布到生产环境中,它就可以正常工作,没有任何修改,但我无法在开发过程中使用它。所以,我的问题是,这是否需要预编译?即使只是在开发环境中?错误是这样的,顺便说一句:“资产被过滤掉并且不会被提供:添加Rails.application.config.assets.precompile+=%w(welcome.css)
到config/initializers/assets.rb
并重新启动你的服务器”我注意到了一些事情,而不是样式表链接标签
,我想你实际上指的是javascript\u包含标签
,正确的?无论如何,我尝试了这种方法,并将config.assets.precompile
添加到我的assets.rb,现在应用程序的行为就像根本没有启用TurboLink一样。我已经通过在%body=javascript\u include\u tag controller\u name之后向我的application.html.haml添加以下行,使其能够单独加载coffescripts,“数据涡轮链接跟踪”=>true
。它几乎能起作用,现在唯一的问题是纸条