2009-10-28 21 views
3

我正在調用返回json數據的服務。在觸發器上傳遞json數據

腳本:

$.ajax({ 
    type: "POST", 
    url: "/some/service", 
    dataType: "json", 
    success: function(response) { 
     if (response.status == "ok" && response.messages.length > 0) { 

      // obj is a jQuery object 
      obj.trigger(SOME_EVENT, response.messages); 

     } 
    } 
}); 

這是響應例如:

{ 
    "status":"ok", 
    "messages":[ 
    {"id":1,"message_text":"latihan"}, 
    {"id":123,"message_text":"hello"}] 
} 

當物鏡接收的SOME_EVENT觸發,我期待它傳遞消息下面的數據:

[{"id":1,"message_text":"latihan"}, 
{"id":123,"message_text":"hello"}] 

但是當我將消息參數輸出到控制檯時,

// on receiving messages 
obj.bind(SOME_EVENT, function(sender, messages) { 
    console.log(messages); 
}); 

轉出,它只能通過下面

{"id":123,"message_text":"hello"} 

人的最後一條消息可以解釋爲什麼消息的排列沒有被我的自定義事件傳遞?

回答

6

http://docs.jquery.com/Events/trigger起,trigger函數的第二個參數是一個附加參數數組(在事件對象之後傳遞)。

response.messages屬性的值是一個數組,所以它們沿實際傳遞到您的處理作爲單獨的參數:

obj.bind(SOME_EVENT, function(sender, message1, message2/*, etc*/) { 
    console.log(message1); // {"id":1,"message_text":"latihan"} 
    console.log(message2); // {"id":123,"message_text":"hello"} 
}); 

您可以乾淨地收集他們作爲一個數組:

obj.bind(SOME_EVENT, function(sender) { 
    var messages = Array.prototype.slice.call(arguments, 1); 
    console.log(messages); // [{"id":1,"message_text":"latihan"}, 
          // {"id":123,"message_text":"hello"}] 
}); 
3

crescentfresh答案是正確的,兩種解決方案都能正常工作。

這是您的第三個選項。您可以撥打trigger - 方法是這樣

obj.trigger(SOME_EVENT, new Array(response.messages)); 

然後console.log(messages);將輸出你的期望

+2

較短的數組符號也能發揮作用'obj.trigger(SOME_EVENT,[response.messages]);' – joshperry 2009-10-28 22:06:08

+0

實際上,需要'console.log(messages [0])來輸出OP期望的內容。 – 2009-10-28 22:56:19