根据我的理解,所有的JavaScript都合并到一个文件中。Rails在添加//= require_tree时默认这样做。到你的application.js manifest文件的底部。
这听起来像是一个真正的救星,但我有点担心特定于页面的JavaScript代码。这段代码是否在每一页上执行?我想要的最后一件事是当我的所有对象只在1页上需要时,为每一页实例化它们。
此外,代码是否也有可能发生冲突?
还是在页面底部放置一个小的脚本标记,只调用一个执行页面javascript代码的方法?
你不再需要require.js了吗?
谢谢
编辑:我很感激所有的答案…我认为他们并没有真正解决问题。其中一些是关于样式的,似乎没有关联……其他人只是提到javascript_include_tag…我知道这是存在的(很明显…),但Rails 3.1的前进方式似乎是将所有JavaScript打包到一个文件中,而不是在每个页面的底部加载单个JavaScript。
我能想到的最好的解决方案是用id或类将某些特性包装在div标签中。在JavaScript代码中,只需检查id或类是否在页面上,如果在,则运行与之关联的JavaScript代码。这样,如果动态元素不在页面上,JavaScript代码就不会运行——即使它包含在由Sprockets打包的庞大application.js文件中。
我上面的解决方案的好处是,如果一个搜索框包含在100个页面中的8个页面上,那么它将只在这8个页面上运行。你也不需要在网站的8个页面上包含相同的代码。事实上,您再也不需要在站点的任何地方包含手动脚本标记。
我想这就是我问题的真正答案。
这是我如何解决样式问题:(原谅Haml)
%div{:id => "#{params[:controller].parameterize} #{params[:view]}"}
= yield
这样我开始所有特定的页面。css。Sass文件:
#post
/* Controller specific code here */
&#index
/* View specific code here */
&#new
&#edit
&#show
这样可以很容易地避免任何冲突。
当涉及到.js时。你可以初始化Coffee文件中的元素,比如;
$('#post > #edit') ->
$('form > h1').css('float', 'right')
希望这能有所帮助。
我知道你已经回答了自己的问题,但还有另一种选择
基本上,您假设//= require_tree。是必需的。事实并非如此。请随意删除它。在我当前的应用程序中,第一个应用程序使用3.1。老实说,我已经做了三个不同的顶级JS文件。我的application.js文件只有
//= require jquery
//= require jquery_ujs
//= require_directory .
//= require_directory ./api
//= require_directory ./admin
通过这种方式,我可以创建子目录,其中包含自己的顶级JS文件,只包括我需要的内容。
关键是:
你可以删除require_tree——Rails允许你改变它所做的假设
application.js这个名字没有什么特别之处——assets/javascript子目录下的任何文件都可以包含带有//=的预处理指令
希望这对ClosureCowboy的回答有所帮助,并添加了一些细节。
在Ryan的带领下,以下是我所做的
application.js.coffee
$ ->
view_method_name = $("body").data("view") + "_onload"
eval("#{view_method_name}()") if eval("typeof #{view_method_name} == 'function'")
view_action_method_name = $("body").data("view") + "_"+$("body").data("action")+"_onload"
eval("#{view_action_method_name}()") if eval("typeof #{view_action_method_name} == 'function'")
Users.js.coffee(特定于控制器的coffeescript,e。G控制器:用户,动作:仪表盘)
window.users_dashboard_onload = () ->
alert("controller action called")
window.users_onload = () ->
alert("controller called")
application.html.haml
%body{:data=>{:view=>controller.controller_name, :action=>controller.action_name}}