2013-04-05 56 views
0

我通過ajax獲取JSON數據,然後想要將這些數據添加到集合中。我想添加/更新新的/現有的對象集合。我以兩種方式做到了。兩者都沒有工作,我知道他們爲什麼不工作。但是必須有解決方案。
1)
如何防止多次添加相同的JSON對象或模型到集合?

var Book = Backbone.Model.extend({}); 
var Library = Backbone.Collection.extend({model: Book}); 
var library = new Library(); 
var bookJSON = { 
    title: "One Thousand and One Nights", 
    author: "Scheherazade" 
} 
var book1 = new Book(bookJSON); 
var book2 = new Book(bookJSON); 
library.add(book1, {merge: true}); 
library.add(book2, {merge: true}); 

結果 library.length = 2

2)

var Book = Backbone.Model.extend({}); 
var Library = Backbone.Collection.extend({model: Book}); 
var library = new Library(); 
var book = { 
    title: "One Thousand and One Nights", 
    author: "Scheherazade" 
} 
library.add(book, {merge: true}); 
library.add(book, {merge: true}); 

結果 library.length = 2

我想添加/更新相同的模型/ JSON對象只有一次收集。 謝謝。

回答

4

您的json沒有id的值,所以Backbone在添加兩次時不知道它們是相同的。

var Book = Backbone.Model.extend({}); 
var Library = Backbone.Collection.extend({model: Book}); 
var library = new Library(); 
var book = { 
    id: 1, // 'id' is the default idAttribute. 
    title: "One Thousand and One Nights", 
    author: "Scheherazade" 
} 
library.add(book, {merge: true}); 
library.add(book, {merge: true}); 

或者:

var Book = Backbone.Model.extend({ 
    idAttribute: 'title' // might not be a good thing to use as an id, though. 
}); 
var Library = Backbone.Collection.extend({model: Book}); 
var library = new Library(); 
var book = { 
    title: "One Thousand and One Nights", 
    author: "Scheherazade" 
} 
library.add(book, {merge: true}); 
library.add(book, {merge: true}); 

通常情況下,你不會設置在客戶端的ID,你讓服務器分配一個ID,當你第一次保存的新模式。但是......缺少id就是爲什麼你看到兩個代碼。

+0

謝謝,它運作良好。以防萬一,對於我的情況,我需要多個'idAttribute'屬性。例如,'id'和'type'。如果你知道更簡單的骨幹方式來實現這一點,這將是有益的) – Ikrom 2013-04-05 05:55:20

0

你的代碼似乎沒問題,你使用的是backbone.js 0.9.9還是更高版本?在0.9.9版本中添加了合併選項 。

+0

我使用Backbone.js 1.0.0 – Ikrom 2013-04-05 05:34:34