我试图了解整个资产管道的问题,并阅读指南和有关它们的几个教程。但有一件事情并不是很清楚,我应该将我的javascript资产文件视为库或放置实际运行的代码的地方,即$(document).ready。因为默认情况下所有的javascript文件都包含在内,并且在那里有几个$(document).ready,这很奇怪,更不用说你不想要$(document).ready函数为每个页面首先运行。这会是什么样的方式?将我的资产文件用作库并将实际调用放入我的视图中(丑陋)?或者有更好的方法吗?
答案 0 :(得分:1)
我也遇到过这个问题。在一个大型项目中,您可以让某人将代码放入文档中,例如,为 div 中的每个 li 添加一个点击功能,并使用类容器强>
现在我们都可以争辩说上面的代码太通用了,当然可能会影响应用程序其他部分的 li 标签,但项目越大,你就越有可能会遇到这样的冲突,导致意外行为。
对于每一个加载的页面运行的大量文档就绪函数,我感到很不舒服。我的解决方案不一定是完美的解决方案,但它是我已经接受并将与您分享的解决方案。
在每个页面的body标签中,我添加了表示控制器和操作的数据元素。然后我有一个文档就绪脚本,它寻找一个以控制器命名的类,其名称为Ready,例如: HomeReady。然后它将在该类上调用一个方法(假设它存在),该方法以该操作命名。所以在你的资产咖啡文件中你可以写:
class @HomeReady
@index: ->
alert("Hello")
@show: ->
alert("Goodbye")
这允许控制权直至行动级别。当我遇到你的问题时,我决定将这个解决方案打包成一个gem,因为我已经在几个项目中使用过它。您可以在https://github.com/intrica/rails_document_ready
找到它答案 1 :(得分:0)
如果您绝对不希望运行某段初始化代码,除非当前页面是特定的控制器/操作,那么您可以尝试在页面上添加一个空元素,其中包含从该信息构建的ID,如“ posts_index“使用这两个助手:
"#{controller_name}_#{action_name}"
然后在你的javascript中,你可以将代码包装在if语句中,该语句检查是否存在具有适当id的元素。
编辑:这是我在评论中提到的js partial的一个例子。
<强> show.html.haml
强>
= render 'map'
map.html.erb
(我通常使用haml,但在erb中编写js更容易)
<script src='http://www.google.com/jsapi' type='text/javascript'></script>
<script type='text/javascript'>
...
</script>
它可能不是那么干净,并且它没有获得成为资产管道的一部分的好处,但我不介意,因为它只包含在特定页面上。