Почему мой RJS перестает работать, когда я устанавливаю опции в form_remote_for? - PullRequest
0 голосов
/ 20 июля 2009

У меня странная проблема.
Я просто хочу отобразить значок загрузки на странице при нажатии кнопки.
Если мой вызов 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 не работает. Почему?

Ответы [ 3 ]

0 голосов
/ 20 июля 2009

Хотя вы и не ответили прямо на вопрос «почему», он не работает, рассматривали ли вы использование параметра :loaded, чтобы скрыть загрузочный DIV, а не полагаться на файл rjs?

0 голосов
/ 22 июля 2009

Если вы используете прототип, вы должны использовать 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.

0 голосов
/ 20 июля 2009

Измените свою форму на:

<% 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» - на основе быстрой реализации скаффолда, которую я сделал. Теперь я, возможно, все еще что-то упускаю, потому что, как я сказал перед массовым редактированием, я новичок, но это должно помочь вам.

РЕДАКТИРОВАТЬ: Удалено "это ваш код?" почта.

...