2009-10-28 83 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