使用Rails 3.1,您将“特定于页面的” JavaScript代码放在哪里?
|
据我了解,您所有的JavaScript都合并为1个文件。默认情况下,Rails在将“ 0”添加到“ 1”清单文件的底部时会执行此操作。
这听起来像是真正的救命稻草,但我有点担心页面特定的JavaScript代码。此代码是否在每个页面上执行?我想要的最后一件事是,当只在一页上需要所有对象时,将为每页实例化我的所有对象。
另外,代码是否也可能发生冲突?
还是在页面底部放置一个小的
script
标记,该标记只是调用执行该页面javascript代码的方法?
那么您不再需要require.js吗?
谢谢
编辑:我感谢所有的答案...,但我认为他们并没有真正解决问题。其中一些是关于样式的,似乎没有关系...而其他人只是提到了javascript_include_tag
...,我知道它确实存在(显然...),但是看来Rails 3.1的发展方向是总结将您所有的JavaScript合并为1个文件,而不是在每个页面的底部加载单个JavaScript。
我能想到的最好的解决方案是用wrap5ѭ或class
es在ѭ4wrap标签中包装某些功能。在JavaScript代码中,您只需检查页面上是否有id
或ѭ6,,如果是,则运行与其关联的JavaScript代码。这样,如果动态元素不在页面上,则JavaScript代码将不会运行-即使Sprockets打包的巨大的“ 1”文件中也包含了JavaScript代码。
我上面的解决方案的好处是,如果搜索框包含在100页中的8页中,它将仅在这8页上运行。您也不必在网站的8个页面上包含相同的代码。实际上,您无需再在网站上的任何位置添加手动脚本标记。
我认为这是对我问题的实际答案。
没有找到相关结果
已邀请:
29 个回复
傻寺俊擒
或
这样的行为这些控制器加载。 链接到:asset_pipeline
俯乡骚钵皆
而且javascript看起来像这样:
和markup_based_js_execution将包含UTIL对象的代码,并在DOM就绪的UTIL.init上执行。 并且不要忘记将其放置到布局文件中:
我还认为,最好使用类而不是
属性,以获得更好的特定于页面的CSS。正如Jason Garber所提到的:特定于页面的CSS选择器可能真的很尴尬(当您使用
属性时) 我希望这能帮到您。
谷靛
是必须的。不是。随时将其删除。老实说,在我当前的应用程序中,我第一次使用3.1.x,我制作了三个不同的顶级JS文件。我的
文件只有
这样,我可以创建带有自己的顶级JS文件的子目录,这些子目录仅包含我需要的内容。 关键是: 您可以删除
-Rails可让您更改其假设 名称
没什么特别的-
子目录中的任何文件都可以包含带有
的预处理程序指令 希望对您有所帮助,并为ClosureCowboy的答案添加一些细节。 苏加尔
拟僚疽刊剔
文件夹中创建目录。
可以将主main1ѭ清单文件配置为从ѭ33加载其文件。特定页面或页面组可以具有自己的清单,这些清单从它们自己的特定目录中加载文件。 Sprockets会自动将ѭ1加载的文件与特定于页面的文件合并,从而使该解决方案有效。 该技术也可用于ѭ35。
蜂佬渺
...,我知道它确实存在(显然...),但是看来Rails 3.1的发展方向是总结将所有Javascript合并为1个文件,而不是在每个页面的底部加载单个Javascript。 我能想到的最好的解决方案是用wrap5ѭ或
es在ѭ4wrap标签中包装某些功能。在javascript代码中。然后,您只需检查页面上是否有
或
,如果是,则运行与之关联的javascript代码。这样,如果动态元素不在页面上,则javascript代码不会运行-即使Sprockets打包的巨大的“ 1”文件中也包含了该代码。 我上面的解决方案的好处是,如果搜索框包含在100页中的8页中,它将仅在这8页上运行。您也不必在网站的8个页面上包含相同的代码。实际上,您不必再在网站上的任何位置添加手动脚本标记-只需预先加载数据即可。 我认为这是对我问题的实际答案。
臀博
我讨厌这个解决方案,但是它在那里而且很快。大概,您可以改为将这些文件称为\“ people-index.js \”和\“ people-show.js \”,然后使用诸如“ѭ44”之类的格式来获得面向视图的解决方案。再次,快速修复,但它与我的配合不佳。 我的数据属性方式 叫我疯了,但是我希望在部署时将我的所有JS编译并缩小到application.js中。我不想记住到处都包含这些散乱的小文件。 我将所有JS加载到一个紧凑的,即将被浏览器缓存的文件中。如果需要在页面上触发我的application.js的某个片段,我让HTML告诉我,而不是Rails。 我没有将我的JS锁定到特定的元素ID或用标记类乱扔我的HTML,而是使用了一个称为“ 45”的自定义数据属性。
在每个页面上,我都使用-在此处插入首选的JS库方法-在DOM完成加载后运行代码。该引导代码执行以下操作: 遍历标记为“ 47”的DOM中的所有元素 对于每个元素,在空间上分割属性值,创建一个标签字符串数组。 对于每个标签字符串,在哈希中执行该标签的查找。 如果找到匹配的键,请运行与其关联的功能,并将元素作为参数传递。 假设我在application.js的某处定义了以下内容:
引导事件将对搜索输入应用
和
函数,将其转变为一个输入,该输入在用户键入时显示建议列表,并在输入空白且不集中时提供某种输入提示。 除非某些元素用“ 51”标记,否则自动触发的代码永远不会触发。但是,它总是存在,缩小并最终在页面上需要的那些时间缓存在我的application.js中。 如果您需要将其他参数传递给标记的JS函数,则必须发挥一些创造力。添加数据参数属性,提出某种参数语法,甚至使用混合方法。 即使我有一些看似控制器特定的复杂工作流程,我也只会在我的lib文件夹中为其创建一个文件,将其打包到application.js中,并用\'new-thing-wizard \'进行标记。当我的引导程序点击该标签时,我的漂亮向导就会实例化并运行。它在需要时针对该控制器的视图运行,但未与该控制器耦合。实际上,如果我对向导进行了正确的编码,则也许可以在视图中提供所有配置数据,因此以后可以将向导重新用于需要它的任何其他控制器。 无论如何,这是我一段时间以来一直在实现页面特定的JS的方式,它对于简单的网站设计和更复杂/更丰富的应用程序都非常有用。希望我在这里介绍的两个解决方案之一(我的方式或Rails方式)对将来遇到此问题的任何人都有所帮助。
容淑阔九
文件中,删除
然后在
中创建一个辅助方法:
然后在您的
布局文件中,在现有的javascript附件中添加带有help57ѭ助手前缀的新助手:
瞧,现在您可以使用在Rails中其他所有地方使用的相同文件结构轻松创建特定于视图的javascript。只需将文件保存在
中即可! 希望对别人有帮助!
莽缓逢
您还可以添加一行以按操作自动加载脚本文件。
只需将页面脚本放入以控制器名称命名的子目录中即可。在这些文件中,您可以使用= require包含其他脚本。 创建一个仅在文件存在时就包括该文件的助手将是很好的,以避免浏览器出现404错误。
碧肮械淌设
哭木算
孝箱捆讨
谷起
假设您的控制器称为“项目”,它将生成:
然后在projects.js.coffee中:
糕泰灌
死搭胯
这样,我将使用以下命令启动所有页面特定的.css.sass文件:
这样,您可以轻松避免任何冲突。 当涉及到.js.coffee文件时,您可以初始化元素,例如;
希望这对一些人有所帮助。
笛驮型迸
篮肥炼皖
(没有看到有人添加实际的解决方案)
夏瓤跋棘
views / layouts / application.html.erb
views / foo / index.html.erb
资产/javascripts/foo.js
资产/javascripts/foostuff/foothis.js.coffee
简要描述;简介 从application.js中删除“ 0”,仅列出每个页面共享的JS。 上面在application.html.erb中显示的两行告诉页面在哪里包括application.js和您的页面特定的JS。 上面在index.html.erb中显示的三行告诉您的视图是查找特定于页面的JS,并将其包含在名为\“:javascript \”(或您想为其命名的名称)的指定屈服区域中。在此示例中,控制器为\“ foo \”,因此Rails将尝试在应用程序布局的:javascript yield区域中包括\“ foo.js \”。 在foo.js(或任何命名的控制器)中列出特定于页面的JS。列出公共库,树,目录等。 将自定义页面特定的JS放在某个地方,以便与其他自定义JS分开轻松地引用它。在此示例中,foo.js需要foostuff树,因此将您的自定义JS(例如foothis.js.coffee)放在此处。 这里没有硬性规定。随意移动事物,甚至在需要时甚至可以创建具有各种名称的多个产量区域。这只是表明可能迈出的第一步。 (鉴于我们使用Backbone.js的方式,我不会完全按照这种方式进行操作。我也可以选择将foo.js放到名为foo而不是foostuff的文件夹中,但尚未决定。) 笔记 您可以使用CSS和
做类似的事情,但这超出了问题的范围。 如果我错过了这里最出色的最佳实践,请给我发送便笺,我会考虑改编。 Rails对我来说还很陌生,说实话,到目前为止,对于默认情况下它给企业发展带来的混乱以及平均Rails程序产生的所有流量,我并没有留下深刻的印象。
邦绊门蔽惩
这仍然允许将所有js通过rails 3.x装入一个小程序包中,但是不会产生太多开销或与不希望js的页面发生任何冲突。
厘恼轨
在您的布局文件中,您需要:
磐乓铝举
懊毁暗
然后在javascripts文件夹的
文件中只有一个闭包和switch语句,如下所示:
您需要在单个文件中进行的所有操作(例如,例如
或
)将它们封装在一个类中,然后对该类符号进行全球化,以便可以在分派器中对其进行访问:
Gitlab有几个这样的例子,如果您好奇的话,您可能想参考一下:)
死搭胯
凄嘛姥
第三步在config / initializers / assets.rb中添加文件
参考资料: http://theflyingdeveloper.com/controller-specific-assets-with-rails-4/
笛驮型迸
佬棠
联海
layouts / application.html.haml:
爆山
,所有CSS代码必须位于
稼悸
users.js.coffee(特定于控制器的咖啡脚本,例如controller:users,action:dashboard)
application.html.haml
嘘崇蔡对
因此,现在无论您想从哪里做,都可以:
就这样,k?