1

私が書いていないコードのトラブルシューティングを試みていますが、Ajax リターンがコールバックを起動しない理由を突き止めるのに非常に苦労しています。ビヘイビアーを ajax 関数にアタッチするコードは次のとおりです。

  # Callback before AJAX request sends
cbBeforeSend = (jqXHR, settings) ->
  console.log jqXHR
  # initialize message/status elements
  $flashIcon.attr 'class', 'icon icon-refresh icon-spin'
  $flashError.html ''
  $flashNotice.html ''

# Callback when AJAX returns with success
cbSuccess = (data, textStatus, jqXHR) ->
  console.log 'success'
  $flashIcon.attr 'class', 'icon icon-ok-sign'
  window.globalLoadCallback()

# Callback when AJAX returns with error
cbError = (jqXHR, textStatus, errorThrown) ->
  console.log 'error'
  $flashIcon.attr 'class', 'icon icon-remove-circle'
  # Run the response javascript, even when the status indicates an error
  if /text\/javascript/.test jqXHR.getResponseHeader('Content-Type') 
    eval jqXHR.responseText

# Callback when AJAX returns
cbComplete = (jqXHR, textStatus) ->
  console.log 'cbComplete'
  if $flashIcon.is('.icon-refresh')
    $flashIcon.attr 'class', 'icon icon-warning-sign'

このアプリケーションには、Quoting/Quoting パスへのリンクが 2 つあります。

新しい引用リンクは機能し、上に示した「success」および「cbComplete」コールバックを起動します。そのリンクのコードは次のとおりです。

<li>
  <%= link_to new_quoting_quote_path, remote:true do %>
    <i class="icon icon-plus-sign"></i>
    <span>New Quote</span>
  <% end %>
</li>

引用の編集リンクが機能し、正しいパーシャルが表示され、オブジェクトがコンソールに返されますが、「成功」および「cbComplete」コールバックは起動しません (エラーも発生しません)。flashIcon のクラスは「icon icon-refresh icon-spin」のままであるため、「cbBeforeSend」コールバックのみが起動します。ブラウザではリンクが「/quoting/quotes/183/edit」としてレンダリングされるため、crm_connection に問題があるとは思いません。正しいIDが提供されているようです。そのリンクのコードは次のとおりです。

<%= client_management_tab 'Health', edit_quoting_quote_path(@crm_connection) %>

申し訳ありませんが、詳細を提供できません。残念ながら、私はこのコードを書いておらず、修正することだけを任されています。ご協力いただきありがとうございます。

これがリクエストを添付するコードだと思います:

  $flashInfo   = $('div.flash-info')
  $flashIcon   = $flashInfo.find('i#ajax-status')
  $flashError  = $flashInfo.find('#flash-error')
  $flashNotice = $flashInfo.find('#flash-notice')
  $(document).bind 'ajax:beforeSend', cbBeforeSendBound
  $(document).bind 'ajax:success', cbSuccessBound
  $(document).bind 'ajax:error', cbErrorBound
  $(document).bind 'ajax:complete', cbCompleteBound

$.ajaxSetup(
  beforeSend: cbBeforeSend
  success: cbSuccess
  error: cbError
  complete: cbComplete
  )
4

2 に答える 2

0

jQuery.ajax への実際の呼び出しが独自のコールバックを設定する場合、ajaxSetup によって提供されるコールバックは無視されると確信しています。これにより、デフォルトの設定以外はほとんど信頼できなくなります。Ricardo が回答で指摘したように、jQuery 開発者はこのメカニズムを使用しないことを推奨しています。

私の見方では、いくつかのオプションがあります。グローバルな ajax イベント バインディングのために jQuery によって提供される一連の他の ajax 関数があります。

jQuery.ajaxStart、jQuery.ajaxStop、jQuery.ajaxComplete、jQuery.ajaxError、jQuery.ajaxSuccess、jQuery.ajaxSend

これらの関数を使用してイベントをバインドすると、常に jQuery を介した ajax 呼び出しによって呼び出されます、実際の ajax リクエストでオプション "global:false" を設定することでオーバーライドすることもできます。

これがあなたに当てはまる場合は、Ricardo の答えにかなりこだわっています。jQuery.ajax への実際の呼び出しを変更してバインディングを行います。

于 2013-08-16T09:17:47.250 に答える
0

ajaxSetup の jQuery ドキュメントから:

Description: Set default values for future Ajax requests. Its use is not recommended.

呼び出しを変更して、コールバックを特定の ajax リクエストに割り当てることをお勧めします。

jQuery.ajax
    url: 'blah/blah',
    success: cbSuccess,
    error: cbError,
    etc
于 2013-07-17T19:53:28.677 に答える