0

私はレールを学んでおり、それを理解したいので、これを「レールの方法」でやろうとしています。

これが私の「問題」です。

home.html.erbに次のような簡単なサブスクリプション フォームがあります。

<%= form_tag(  subscribe_newsletter_path , id:'subscribe-form', remote: true) do %>
    <%= email_field(:subscription, :email, placeholder: 'ex: Giroud@Arsenal.com') %>
    <%= submit_tag("Subscribe Now!", class: 'btn btn-success') %>
<% end %>

home.jsの私の JavaScript は次のとおりです。

$('#subscribe-form')
.on('ajax:beforeSend', function(){
    console.log('before send');
})
.on('ajax:success', function(){
    console.log('success');
})
.on('ajax:complete', function(){
    console.log('complete');
})
.on('ajax:error', function(){
    console.log('fail');
})

私のapplication.js

//= require jquery
//= require jquery_ujs
//= require_tree .

私のhome_controller.rbファイルは次のようになります(これは私にとってトリッキーになる場所です)

response = //Response message from mailchimp API. looks like that {"error"=>"bablabla@gmail.com is already subscribed to list Testing Rails. <a href=\"http://test.us6.list-manage1.com/subscribe/send-email?u=test&id=test&e=test==\">Click here to update your profile.</a>", "code"=>214}

render json: response, status: '200'

ajaxリクエストが発生し、コントローラーがメールを受信して​​mailchimp APIに送信し、ブラウザに送り返します(ステータス200、Chrome開発ツールでjson応答を確認できます)が、バインドイベントはトリガーされません。 ... $('#subscribe-form') ではなく $(document) にイベントをバインドすると正常に動作するため、動作していることはわかっています...

なんで?

4

1 に答える 1

2

jQuery 1.7 の時点で、.on() メソッドは、イベント ハンドラーをドキュメントにアタッチするための推奨メソッドです。以前のバージョンでは、.bind() メソッドを使用して、イベント ハンドラーを要素に直接アタッチしていました。ハンドラーは、jQuery オブジェクトで現在選択されている要素に関連付けられているため、.bind() の呼び出しが発生した時点でそれらの要素が存在している必要があります。より柔軟なイベント バインディングについては、.on() または .delegate() のイベント委任の説明を参照してください。

詳細: http://api.jquery.com/bind/

Rails 3.2アプリで私のために働いた方法は、単なる例であり、あなたのケースの正確な解決策ではありません:

$(document).ajaxSend(function() {
  $( "#loading" ).show();
});

$(document).ajaxComplete(function() {
  $( "#loading" ).hide();
});

そのため、新しい Jquery バージョンを使用しているときに .bind を使用することに問題がある可能性があります。


編集

このajaxComplete()メソッドは、AJAX 要求が完了したときに実行される関数を指定します。

注: jQueryバージョン1.8以降、このメソッドはdocumentにのみ添付する必要があります。

とは異なりajaxSuccess()ajaxComplete()メソッドで指定された関数は、リクエストが成功しなくても完了すると実行されます。

于 2013-07-26T10:19:29.387 に答える