javascript - 不明白为什么 Backbone collection.create 不 POST 一个数组

标签 javascript backbone.js

我正在试用 Backbone 并遇到了一些问题。

如果我将 Collection.create 与模型数组一起使用,那么发布到服务器的 JSON 似乎不太容易解析。

例子:

var Person = Backbone.Model.extend({
    initialize: function() {
        this.on( 'all', function(e)
                { console.log( "Person model all " + this.get("name") + ", event: " + e ); }
            );
    }
});

var People = Backbone.Collection.extend({
    initialize: function() {
        this.on( 'all', function(e) { console.log( "People collection event: " + e ); } );
    },
    url: "/models/",
    model: Person
});

var people = new People();
people.create( [ { "name":"joe", "age":24 }, { "name":"dan", "age":42 } ] );

然后我的服务器收到以下 JSON:

{"0":{"name":"joe","age":24},"1":{"name":"dan","age":42}}

这是什么,为什么它不是像这样的简单数组:

[{"name":"joe","age":24},{"name":"dan","age":42}]

事实上,它很难解析,因为更糟糕的是,如果您执行 Model.save(),那么您会得到一个没有这些 ID 值的简单对象(更有效)。

我能够解析此收藏贴的唯一方法是执行以下操作:

for( var n in payloadobj )
{
    var person = new Object();
    person.id = parseInt(n, 10);
    person.name = payloadobj[n].name;
    person.age = payloadobj[n].age;
}

有谁知道这是为什么,我是不是遗漏了什么,我是要重写一些东西以使其更一致还是我应该避免使用 Collection.create?

最佳答案

Backbone 中的集合在内部使用数组,但旨在方便地提供对有序和无序模型的访问。因此,当您添加没有 ID 的 People 实例时,系统会自动为它们分配一个 cid (clientId) 属性(因为您没有提供替代 ID)。

但是,在您提供的情况下,您的代码正在调用 Create 方法,该方法一次只接受一个模型(不是数组)。因此,它在内部创建了错误的结构。你可以这样做:

var people = new People([{ "name": "joe", "age": 24 }, { "name": "dan", "age": 42}]);

create 方法只是一个方便的方法,它在每个模型 (以 'c' 为前缀)。

因此,如果您编写自己的保存函数,则只需对人员集合调用 toJSON 即可获得所需内容(Person 对象数组)。

关于javascript - 不明白为什么 Backbone collection.create 不 POST 一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10473362/

相关文章:

javascript - 更改事件不会从主干集合传播到主干模型

javascript - 选择前弹出显示

javascript - 以优雅的方式根据模型的属性迭代 Backbone 集合

javascript - 在 requirejs、backbonejs 中使用应用程序级持久化模型

javascript - 动态创建 javascript 对象(Backbone View)

javascript - 从 Parse Cloud 销毁对象是不可靠的

c# - 如何解码使用 encodeURIComponent() 在 JS 中编码的 HTML?

javascript - 如何减少 Javascript 中多个变量的对象数组?

javascript - 使用 Jcrop 裁剪上传的图像

javascript - 从 ng-click 调用时,Angularjs 绑定(bind)不起作用