Rails 3 UJS驱动程序事件

时间:2010-10-14 13:19:47

标签: ruby-on-rails ajax prototypejs ujs

根据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

2 个答案:

答案 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。