События $ .ajax, как создать обратный вызов? - PullRequest
4 голосов
/ 27 ноября 2011

Я знаю, что заголовок был не очень интуитивно понятным, поэтому я попытаюсь подробно описать мою проблему:

Я создаю плагин jQuery для выполнения асинхронных вызовов.С его помощью я могу, например, сделать сообщение, используя следующую команду:

$("form").bindAjaxPost "post"

Проблема в том, что я хотел бы создать обратные вызовы для этих событий (beforeSend, complete, success, error), например, команда будет выглядеть примерно так:

$("form").bindAjaxPost "post", 
    success: (data) -> console.log "user success #{data}"
    beforeSend: () -> console.log "user beforeSend"

Обратите внимание, что событие beforeSend и success было определено пользователем плагина, а также внутренне в коде плагина:См. Код:

Метод post jquery plugin

post: (ajaxUserOptions)-> 

    ajaxOptions = 
        type: "POST"
        url: @options.url
        data: $(@form).serialize()
        dataType: @options.dataType

        beforeSend: ->
            console.log "plugin beforeSend"

        complete: ->
            console.log "plugin complete"

        success: (data) ->
            console.log "plugin success"

        error: (request) ->
            console.log "plugin error"


    ajaxOptions = $.extend {}, ajaxUserOptions, ajaxOptions if ajaxUserOptions
    $.ajax(ajaxOptions)

Задача

Я хотел бы, чтобы событие события было вызвано изнутри, а затемпользовательский плагин событий.(эта последовательность)

Пример выполнения

Команда

$("form").bindAjaxPost "post", 
    success: (data) -> console.log "user success #{data}"
    beforeSend: () -> console.log "user beforeSend"

Вывод

Плагин перед отправкой пользователюbeforeSend плагин успех пользователь успех

попытки

Как вы можете видеть в коде, я попытался использовать команду extend из jQuery.Но это не сработало, потому что $.ajax().beforeSend принимает только одну функцию.

Я также пытался получить доступ к ajaxUserOptions, но ajaxUserOptions недоступен в событиях success, beforeSend ..., поскольку эти вызовы асинхронные.

Спасибо всем за помощь!

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

Возможно, вам будет проще реализовать это с помощью интерфейса Promise, добавленного к возвращаемому значению $.ajax в jQuery 1.5. При этом вы можете прикрепить несколько обратных вызовов complete, success и error (предпочтительно как always, done и fail, так как прежние имена будут устаревшими в jQuery 1.8.) код может стать

    post: (ajaxUserOptions = {}) -> 

        defaultAjaxOptions =
            type: "POST"
            url: @options.url
            data: $(@form).serialize()
            dataType: @options.dataType

        jqXHR = $.ajax($.extend {}, ajaxUserOptions, defaultAjaxOptions)
        jqXHR.always pluginAlways
        jqXHR.always ajaxUserOptions.always if ajaxUserOptions.always
        # and likewise for fail and done

beforeSend более сложный случай, поскольку вы не можете сделать это с объектом jqXHR, но это просто вопрос оборачивания функции вашего плагина и пользовательской функции в одну функцию, где, если любая из функций возвращает false внешняя функция делает это (так как это останавливает запрос Ajax):

beforeSend = ->
  return false if pluginBeforeSend() is false
  return false if ajaxUserOptions?.beforeSend() is false
1 голос
/ 27 ноября 2011

Не могли бы вы позвонить по запросу пользователя изнутри вашего плагина, если они существуют?Похоже на это:

post: (ajaxUserOptions)-> 

  ajaxOptions = 
    type: "POST"
    url: @options.url
    data: $(@form).serialize()
    dataType: @options.dataType

    beforeSend: ->
      console.log "plugin beforeSend"
      ajaxUserOptions.beforeSend() if ajaxUserOptions?.beforeSend?

    complete: ->
      console.log "plugin complete"

    success: (data) ->
      console.log "plugin success"
      ajaxUserOptions.success(data) if ajaxUserOptions?.success?

    error: (request) ->
      console.log "plugin error"

    $.ajax(ajaxOptions)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...