我遇到了一个奇怪的问题
我只想在按下按钮时在页面上显示加载图标
如果我对form_remote_for
的调用包含Ajax选项,则RJS脚本不起作用。
此作品(“加载”被控制器和RJS隐藏):
查看:
<%=form_remote_for(:job, @job, {:url => {:action=>:create}}) do |f| %>
[...]
<div id="loading">Loading...</div>
控制器:
def create render :action => "create.js.rjs" end
RJS:
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脚本不起作用。为什么呢?
答案 0 :(得分: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,因为它发布到“new” - 基于我做的快速脚手架实现。现在我可能仍然会遗漏一些东西,因为正如我在大规模编辑之前所说的那样,我是新手,但这应该让你前进。
编辑:删除“这是你的代码吗?”交。
答案 1 :(得分:0)
虽然没有直接回答你的“为什么”它不起作用的问题,你是否看过使用:loaded
参数来隐藏加载DIV而不是依赖rjs
文件?
答案 2 :(得分: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事件的页面。