2010-05-26 70 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,這是演示的形式。
  • 數據,這是一個需要加載的形式
  • FLASH,任何驗證或服務器錯誤
  • 狀態告訴客戶端所發生的事情在服務器上的任何數據。

我的問題是:這是一種處理客戶端事件消息的有效方法,還是我要走下一條心痛和痛苦的道路?

+2

你註冊了編程,一個心痛和痛苦的道路是放心的,這是否會有助於空氣:) – 2010-05-26 15:13:52

+1

如果你一直在走自己的道路(我最終做了什麼夢幻般的結果)你可能想要實現一個全局事件來處理消息。您可以附加到ajaxComplete(http://api.jquery.com/ajaxComplete/)事件並直接從xhr獲取結果,然後檢查是否有消息要處理。我實現了像SO一樣的下拉消息,最上面有三個級別:警告,狀態和錯誤(錯誤是一個對話框)。 – 2010-05-26 15:25:54

+0

我認爲這會更多的陰/陽(疼痛/愉悅)。他們在哪裏說快樂部分是? – Gutzofter 2010-05-26 15:29:26

回答

2

OpenAjax Hub(從OpenAjax聯盟)指定發佈/訂閱爲基礎的活動中心(主題總線)。看看開源參考實現:http://openajaxallianc.sourceforge.net/

TIBCO也有一個用JavaScript實現的事件總線,名爲PageBus,但我想上面是更「標準」的。

+0

它看起來像客戶端的標準pub/sub。我可以很容易地用你自己的方式推出。儘管我確實喜歡託管中心選項,但我必須考慮這一點。 – Gutzofter 2010-05-29 18:14:22

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本身。

1

爲什麼你想要從頭開始構建一個msg處理程序,走上心痛和痛苦之路?如果您已經在使用jQuery Lib,比如jQuery,當然,您可以使用一組完整的銳化刀片,例如Global Ajax Event Handlers以及像Theme Roller這樣的css庫文件,用於設計您的消息!

正如已經被其他隊友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被禁用!