2010-05-26 4 views
4

Есть ли какие-либо стандарты или системы обмена сообщениями для AJAX?Стандартная система обмена сообщениями событий с 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, это представление формы.
  • DATA, это любые данные, которые должны быть загружены в виде
  • FLASH, любые проверки или серверные ошибки
  • STATUS рассказывает клиенту, что произошло на сервере.

Мой вопрос: Является ли это допустимым способом обработки сообщений событий на стороне клиента или я иду по пути страдания и боли?

+2

Вы зарегистрировались для программирования, путь страдания и боли гарантированно, будет ли это способствовать в воздухе :) –

+1

Если вы продолжаете идти по дороге, сворачивая свои собственные (что я в итоге сделал с фантастическими результатами), вы можете захотеть реализовать глобальное событие для обработки сообщений. Вы можете подключиться к событию ajaxComplete (http://api.jquery.com/ajaxComplete/) и получить результат от xhr напрямую, а затем проверить, есть ли сообщения для обработки. Я реализовал что-то вроде SO с раскрывающимися сообщениями вверху с тремя уровнями: предупреждение, состояние и ошибка (ошибка - это диалоговое окно). –

+0

Я думал, что это будет больше инь/ян (боль/удовольствие). Где они сказали, что часть удовольствия? – Gutzofter

ответ

2

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

+0

Похоже, что он основан на Java. Также я не думаю, что он достаточно легкий. Но спасибо. – Gutzofter

2

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

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

+0

Он выглядит как стандартный паб/суб для клиентской стороны. И я могу получить это довольно легко, свернув свой собственный. Мне понравились опции управляемого хаба, но я должен буду изучить это. – Gutzofter

1

Я бы проголосовал за предложение @ dan-heberden: using 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.

1

Почему вы хотите спуститься по пути страдания и боли, построив один обработчик msg с нуля? если вы уже используете 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>"); 
     }); 

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

, так как вы не ищете типичные ошибки 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 отключен!

Смежные вопросы