0

我遇到了一个奇怪的问题。
我只想在按下按钮时在页面上显示一个加载图标。
如果我的调用form_remote_for包含 Ajax 选项,则 RJS 脚本不起作用。

这有效(“加载”被控制器和 RJS 隐藏):

看法:

<%=form_remote_for(:job, @job, {:url => {:action=>:create}}) do |f| %>
[...]
<div id="loading">Loading...</div>

控制器:

定义创建  
  渲染:动作=>“create.js.rjs”   
结尾

RJ:

page.hide 'loading'

这不起作用(视图只显示添加:loading=>和加载,但控制器没有像以前那样隐藏):

<%=form_remote_for(:job, @job, {:url => {:action=>:create}}, {:loading=>"$('loading').show()"}) do |f| %>
[...]
<div id="loading" style="display:none;">Loading...</div>

因此,如果我的调用form_remote_for包含 Ajax 选项,则 RJS 脚本不起作用。为什么?

4

3 回答 3

0

将您的表格更改为:

<% form_remote_for (:job, @job, :url => {:action => :create}, :loading =>"$('loading').show()") do |f| %>
# ...
<% end %>

确保创建是:

  # POST /jobs
  # POST /jobs.xml
  def create
    render :action => "create.js.rjs"
  end

并确保您的 create.js.rjs 是:

page.hide 'loading'

这种情况对我有用。正如你所拥有的,它正在返回模板中的 erb,因为它正在发布到“新”——基于我所做的快速脚手架实现。现在我可能仍然遗漏了一些东西,因为正如我在大规模编辑之前所说的,我是新人,但这应该能让你继续前进。

编辑:删除“这是你的代码吗?” 邮政。

于 2009-07-19T22:17:59.300 回答
0

虽然没有直接回答“为什么”它不起作用的问题,但您是否考虑过使用:loaded参数隐藏加载 DIV 而不是依赖rjs文件?

于 2009-07-20T01:43:34.183 回答
0

假设您使用原型,您应该使用 Ajax.Responders 来显示/隐藏:

Ajax.Responders.register({
  onCreate: function() {
    Ajax.activeRequestCount++;
        if($('loading') && Ajax.activeRequestCount>0) {
      Effect.Appear('loading',{duration:0.4,queue:'end'});
        };          
  },
  onComplete: function() {
    Ajax.activeRequestCount--;
        if($('loading') && Ajax.activeRequestCount==0) {
        Effect.Fade('loading',{duration:0.4,queue:'end'});
        };    
  }
});

您可以将其粘贴在 public/javascripts/application.js

不显眼的 javascript - 可以在任何带有隐藏加载 div 和 ajax 事件的页面上工作。

于 2009-07-22T15:58:20.767 回答