2012-05-06 62 views
2

我嘗試骨幹,並創下了一點問題。不明白爲什麼骨幹collection.create犯規張貼陣列

如果我使用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?

回答

1

集合在骨幹網使用陣列內部,但爲了方便提供進入有序和無序的車型。因此,當您添加沒有ID的People實例時,它們將自動被分配一個cid(clientId)屬性(因爲您沒有提供替代ID)。

然而,在您目前的情況下,你的代碼調用Create方法,該方法只需要一個模型在一個時間(不陣列)。所以,它在內部創建了錯誤的結構。你可以這樣做:

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

create方法僅僅是分析一個模型(並尋找cid/id)對每個模型(以「C」前綴)的便捷方法。因此,如果您編寫自己的保存功能,則可以在人員集合上撥打toJSON,然後您將獲得您想要的內容(Person對象數組)。

+0

它仍然是非常奇怪的是,它以這種方式張貼這個奇怪的建築到服務器A)服務器不關心內部ID骨幹網採用了和b)證明(a),當你剛剛創建一個模型在同一時間,然後它不會發布CID,並張貼正確的JSON對象......我認爲在一個「創建」創建多個對象應避免 – Dan

+0

是 - 我意識到,我誤解你代碼(特別呼叫'創建')。所以,Backbone創建了一個完全不是你想要的內部結構(它仍然創建了一個CID,但它並不真正創建一個Person對象)。我已經解決了我的答案。 – WiredPrairie