根据Simone Carletti blog post的说法,Rails 3 ajax助手已经发生了很大的变化。我们应该使用rails 3编写比使用rails 2更多的javascript。
我试图找出如何显示ajax加载gif - 而ajax查询正在运行 - 在“rails 3 way”中。我想出了这种代码,它使用Rails 3 UJS驱动程序发送的javascript事件。这个例子使用原型:
<div id="wait" style="display:none">
<img src="/images/ajax-loader.gif"> Please wait...
</div>
<div>
<%= link_to 'Get', 'finished', :id => "mylink", :remote => true %>
</div>
<%= javascript_tag do %>
Event.observe('mylink', 'ajax:before', function(event) {
$('wait').show();
});
Event.observe('mylink', 'ajax:complete', function(event) {
$('wait').hide();
});
<% end %>
这很好用,但我希望有可能在原型和scriptaculous帮助器的帮助下编写这些ajax事件“触发器”,就像我们使用link_to_function一样:
<%=
link_to_function("toggle visibility") do |page|
page.toggle "wait"
end
%>
有没有办法做到这一点,或者我们是否应该直接在javascript中编写ajax事件“触发器”,无论是原型还是jquery?
致以最诚挚的问候,
Philippe Lang
答案 0 :(得分:5)
UJS的想法是将javascript代码移出视图到单独的js文件中。你这样做的方式就是打败这个目标。相反,我相信你应该有一个带有“dom:loaded”的js文件或类似的处理程序,它为rails回调和其他事件设置处理程序。
像(使用原型):
(function () {
$(document).on('dom:loaded', function (event) {
$$('a[data-remote=true]').each(function (link) {
link.on('ajax:complete', function (request) {
// do something
});
});
});
}());
这样所有javascripts都与视图分开,这是不引人注目的javascript的想法。
答案 1 :(得分:0)
在查看rails源代码后,我想出了这个解决方案:
def javascript_event_tag(name, event, &block)
content = "Event.observe('#{name}', '#{event}', function() {"
content = content + update_page(&block)
content = content + "});"
content_tag(:script, javascript_cdata_section(content))
end
这使得更容易对UJS事件做出反应:
<div id="wait" style="display:none">
<img src="/images/ajax-loader.gif"> Please wait...
</div>
<%= link_to 'ajax call', 'code_on_controller', :id => "mylink", :remote => true %>
<%=
javascript_event_tag('mylink', 'ajax:before') do |page|
page.show 'wait'
end
%>
<%=
javascript_event_tag('mylink', 'ajax:complete') do |page|
page.hide 'wait'
end
%>
您不必编写原始原型或jquery代码,而是可以使用rails helpers。