使用AJAX的标准事件消息系统?

时间:2010-05-26 14:58:16

标签: jquery ajax tdd integration-testing qunit

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告诉客户端服务器上发生了什么。

我的问题是:这是一种在客户端处理事件消息传递的有效方法,还是我会走上痛苦和痛苦的道路?

4 个答案:

答案 0 :(得分:2)

我认为这值得看http://www.jboss.org/errai

答案 1 :(得分:2)

OpenAjax Hub(来自OpenAjax联盟)指定基于发布/订阅的事件中心(主题总线)。看看开源参考实现:http://openajaxallianc.sourceforge.net/

TIBCO还有一个用JavaScript实现的事件总线PageBus,但我想上面的内容更“标准”。

答案 2 :(得分:1)

我会投票给@ dan-heberden的建议:使用api.jquery.com/ajaxComplete或api.jquery.com/ajaxSucces,例如以下用jquery处理ajax事件。

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

我相信你的问题不需要框架,接受jquery本身。

答案 3 :(得分:1)

为什么你想从头开始构建一个msg处理程序,从而走上痛苦和痛苦的道路?如果你已经在使用像jQuery这样的js Lib,当然,你有一套完整的锐化刀片,比如 Global Ajax Event Handlers ,还有一个像Theme Roller这样的css lib,用于你的邮件样式!?

正如其他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,你也可以防止滥用!