在触发器上传递json数据

时间:2009-10-28 19:23:58

标签: javascript jquery javascript-events

我正在调用一个返回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"}]
}

当obj收到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"}

任何人都可以解释为什么我的自定义事件没有传递消息数组?

2 个答案:

答案 0 :(得分: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"}]
});

答案 1 :(得分:3)

crescentfresh 答案是正确的,两个解决方案都有效且有效。

这是您的第三个选择。您可以像这样调用trigger - 方法

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

然后console.log(messages);将输出您期望的内容