Расширение каждого события Ajax.Request onSuccess (Javascript Prototype Framework) - PullRequest
0 голосов
/ 13 ноября 2008

У меня есть приложение, которое использует Ajax.Request и его обработчик событий onSuccess во многих местах.

Мне нужно вызвать функцию (которая проверит ответ) до того, как сработают все эти onSuccess события. Я пытался использовать Ajax.Responders.register с событием onComplete, но оно срабатывает после события Ajax.Request onSuccess. Есть предложения?

Ответы [ 6 ]

4 голосов
/ 05 февраля 2010

аналогично ответу Александра Крживинского, но я полагаю, что это не позволит вам распространять использование «обтекания» везде, объединяя его с ответчиком onCreate.

Ajax.Responders.register({

  onCreate: function(request) {

    request.options['onSuccess'] = request.options['onSuccess'].wrap(validateResponse);

  }

});
3 голосов
/ 13 ноября 2008

Есть несколько событий на выбор . Вот цепочка событий для Ajax.Request:

  1. onCreate
  2. onUninitialized
  3. onLoading
  4. onLoaded
  5. onInteractive
  6. onXYZ, onSuccess или onFailure
  7. onComplete

onLoading, onLoaded, onInteractive звучат интересно, но согласно спецификации они не гарантируются. Это дает вам возможность подключиться к onCreate, который вызывается сразу после сборки объекта запроса, но до того, как запрос фактически будет выполнен.

1 голос
/ 26 июня 2010

Не знаю, является ли это самым чистым решением, но для меня это помогло.


var tmp = Ajax.Request;
Ajax.Request = function(url, args) {
 // stuff to do before the request is sent
 var c = Object.clone(args);
 c.onSuccess = function(transport){
  // stuff to do when request is successful, before the callback
  args.onSuccess(transport);
 }

 var a = new tmp(url, c);
 return a;
}
Ajax.Request.protoype = new tmp();
Ajax.Request.Events = tmp.Events;
delete tmp;
1 голос
/ 11 мая 2009

Это может быть немного поздно, но в интересах всех, кто интересуется той же проблемой, я предложу следующее решение:

Для этого вы можете использовать собственную реализацию аспектно-ориентированного программирования в Prototypes. Конечно, вам придется изменить все ваши onSuccess-параметры, но это можно сделать с помощью простого поиска и замены вместо обновления всех ваших функций обратного вызова. Вот пример создания Ajax.Request:

new Ajax.Request('example.html', {
    parameters: {action: 'update'},
    onSuccess: this.updateSuccessful
});

Скажем, у вас есть похожие фрагменты кода, разбросанные по всему коду, и вы хотите, чтобы им предшествовала определенная функция, которая проверяет ответ до запуска фактической функции (или даже вообще запрещает ее запуск). Используя Funtion.wrap, поставляемый в Prototype, мы можем сделать это, расширив код выше:

new Ajax.Request('example.html', {
    parameters: {action: 'update'},
    onSuccess: this.updateSuccessful.wrap(validateResponse)
});

Где 'validateResponse' - функция, подобная этой:

// If you use the X-JSON-header of the response for JSON, add the third param
function validateResponse(originalFn, transport /*, json */) {
    // Validate the transport

    if (someConditionMet) {
        originalFn(transport /*, json */);
    }
}

Таким образом, вы расширили свои функции onSuccess в одном центральном месте, просто выполнив быстрый поиск onSuccess и вставив его в «wrap (validateResponse)». Это также дает вам возможность иметь несколько функций-оболочек в зависимости от потребностей конкретного Ajax-запроса.

1 голос
/ 13 ноября 2008

Вы можете запустить свой метод перед другим кодом в onSuccess и вернуть false, если что-то не так.

0 голосов
/ 20 ноября 2008

«Общее решение» - независимо от структуры JS (вид)

var oldFunc = Ajax.Request.onSuccess;
Ajax.Request.onSuccess = function foo() {
  alert('t');
  oldFunc.apply(this, arguments);
}

Это "расширит" вашу функцию JS, заставив ее делать точно то, что она делала, за исключением отображения окна предупреждения каждый раз перед выполнением ...

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