Стандартная система обмена сообщениями о событиях с AJAX? - PullRequest
4 голосов
/ 26 мая 2010

Существуют ли какие-либо стандарты или структура обмена сообщениями для AJAX?

Прямо сейчас у меня есть одна страница, которая загружает контент, используя Ajax. Поскольку у меня была сложная форма для ввода данных как часть моего контента, мне нужно проверить определенные события, которые могут произойти в моей форме. Итак, после некоторых корректировок, проведенных моими тестами:

asyncShould("search customer list click", 3, function() {
    stop(1000);
    $('#content').show();
    var forCustomerList = newCustomerListRequest();
    var forShipAndCharge = newShipAndChargeRequest(forCustomerList);

    forCustomerList.page = '../../vt/' + forCustomerList.page;
    forShipAndCharge.page = 'helpers/helper.php';
    forShipAndCharge.data = { 'action': 'shipAndCharge', 'DB': '11001' };

    var originalComplete = forShipAndCharge.complete;

    forShipAndCharge.complete = function(xhr, status) {
        originalComplete(xhr, status);
        ok($('#customer_edit').is(":visible"), 'Shows customer editor');
        $('#search').click();
        ok($('#customer_list').is(":visible"), 'Shows customer list');
        ok($('#customer_edit').is(":hidden"), 'Does not show customer editor');
        start();
    };

    testController.getContent(forShipAndCharge);
});

Вот контроллер для получения контента:

    getContent: function (request) {
        $.ajax({
            type:       'GET',
            url:        request.page,
            dataType:   'json',
            data:       request.data,
            async:      request.async,
            success:    request.success,
            complete:   request.complete
        });
    },

А вот запрос события:

function newShipAndChargeRequest(serverRequest) {
var that = {
    serverRequest: serverRequest,
    page: 'nodes/orders/sc.php',
    data: 'customer_id=-1',
    complete: errorHandler,
    success: function(msg) {
        shipAndChargeHandler(msg);
        initWhenCustomer(that.serverRequest);
    },
    async: true
};
return that;

}

А вот обработчик успеха:

function shipAndChargeHandler(msg) {
    $('.contentContainer').html(msg.html);
    if (msg.status == 'flash') {
        flash(msg.flash);
    }
}

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

$message['status'] = 'success';
$message['data'] = array();
$message['flash'] = '';
$message['html'] = '';
echo json_encode($message);

Итак, загрузка контента состоит из двух частей:

  • HTML, это представление формы.
  • ДАННЫЕ, это любые данные, которые необходимо загрузить для формы
  • FLASH, любые ошибки проверки или сервера
  • STATUS сообщает клиенту, что произошло на сервере.

У меня такой вопрос: это правильный способ обработки сообщений о событиях на стороне клиента или я иду по пути душевной боли и боли?

Ответы [ 4 ]

2 голосов
/ 29 мая 2010

OpenAjax Hub (из OpenAjax Alliance) указывает концентратор событий на основе публикации / подписки (тематическая шина). Взгляните на эталонную реализацию с открытым исходным кодом: http://openajaxallianc.sourceforge.net/.

В TIBCO также реализована шина событий, реализованная на JavaScript, которая называется PageBus , но я думаю, что вышеприведенное более "стандартно".

2 голосов
/ 26 мая 2010

Я думаю, это стоит посмотреть на http://www.jboss.org/errai

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

Почему вы хотите пойти по пути душевной боли и боли, создав один обработчик сообщений с нуля? если вы уже используете js Lib, например jQuery, и, конечно, у вас есть полный набор заостренных блейдов, таких как Global Ajax Event Handlers и css lib, например Theme Roller для стиля ваших сообщений!?

Как уже упоминалось другими товарищами по SO: это пришло со страницы jQuery:

Показывать сообщение при запросе Ajax завершается успешно.

$("#msg").ajaxSuccess(function(evt, request, settings){
      $(this).append("<li>Successful Request!</li>");
      });

Тогда, то, что я могу сделать, может быть, указывает на то, чтобы вы лучше использовали эти инструменты es.:

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

$.ajaxComplete(function(event, xhr, options) {
    var data = xhr.responceText;
    switch(data) {
    case 'err_1': 
    // do_something(1)
    break;
    case 'err_2': 
    // do_something(2)
    break;
    case 'err_3': 
    // do_something(3)
    break; 
    }
});

Где каждый err_# происходит из бэкэнда после того, как вы проверили все данные, если обнаружена ошибка, вы отправляете через ajax код ошибки, остальное - сахар! ;)

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

1 голос
/ 31 мая 2010

Я бы проголосовал за предложение @ dan-heberden: используя api.jquery.com/ajaxComplete или api.jquery.com/ajaxSucces, как, например, следующее для обработки событий ajax с помощью jquery.

$('.contentContainer').ajaxSuccess(function(e, xhr, settings) {
  var msg.html = "<p>You did it!</p>";
  shipAndChargeHandler(msg);
});

Мне не нужны фреймворки для вашей проблемы, я верю, что сам jquery.

...