2012-12-11 63 views
3

我有一個集合,我沒有運氣從它刪除特定的模型。Backbone remove()from Collection

使用fetch()從服務器拉取集合,然後使用數據填充視圖。該集合只包含一個ID列表。抓取集合看起來像在此之後:

d {**length: 9**, models: Array[9], _byId: Object, _byCid: Object, _ioEvents: Object…} 
_byCid: Object 
_byId: Object 
_callbacks: Object 
_ioEvents: Object 
addRoom: function() { [native code] } 
joinRoom: function() { [native code] } 
length: 9 
models: Array[9] 
0: d 
_callbacks: Object 
_escapedAttributes: Object 
_pending: Object 
_previousAttributes: Object 
_silent: Object 
attributes: Object 
**_id: "50c6cf36ece4f5f327000006"** 
__proto__: Object 
changed: Object 
cid: "c3" 
collection: d 
__proto__: x 
1: d 
2: d 
3: d 
4: d 
5: d 
6: d 
7: d 
8: d 
length: 9 
__proto__: Array[0] 
removeRoom: function() { [native code] } 
__proto__: x 

現在,當我去從集合中移除一個模式,我做這個

// called from the collection class so this = collection 
this.remove({_id:data._id}); 

並沒有任何反應,沒有錯誤,沒有沒什麼。當我登錄收集時,它具有完全相同的數據。任何幫助,將不勝感激。

回答

7

這不是Collection#remove的工作方式。從fine manual

除去collection.remove(models, [options])

從集合中刪除一個模型(或模型的陣列)。

這是一個對象:

{_id: data._id} 

不是模型。即使您尚未爲您的收藏指定model屬性,集合仍將包含Backbone.Model實例。所以,你有你的data._id轉換成模型,然後交給該模式remove

var m = collection.where({ _id: data._id})[0]; 
collection.remove(m); 

理想情況下,你需要創建一個模型「一流」爲你的收藏,讓你可以設置idAttribute

var M = Backbone.Model.extend({ idAttribute: '_id' }); 
var C = Backbone.Collection.extend({ model: M }); 

那麼你可以使用Collection#get通過_id查找模型:

var m = collection.get(data._id); 
collection.remove(m); 
+0

而且因爲我創造了一個模型類我t很容易設置idAttribute,它的工作方式就像我預期的那樣。我不知道我爲什麼傳遞一個對象!非常感謝mil的外觀。 –

+0

@Charles:不用擔心,你應該看到我在代碼中所做的一些荒謬的事(後視)。 –