2011-12-14 223 views
1

在我的Backbone.js應用程序中,我有一個包含集合的模型。爲了支持從後端獲取該模型,我重寫了解析方法,將JSON響應中的數組轉換爲集合實例。它看起來是這樣的:Backbone.js包含集合的模型視圖?

class SomeModel extends Backbone.Model 
    defaults: -> 
    collection: new SomeCollection([new SomeModel(attr: value)]) 

    parse: (res) -> 
    res.collection = new SomeCollection(res.collection) 
    res 

class SomeCollection extends Backbone.Collection 
    model: SomeOtherModel 

class SomeCollectionView extends Backbone.View 
    el: $('collection-view') 

我的問題是,雖然SomeCollectionView調用SomeModel.fetch()該實例被替換時,勢必會SomeCollection,現有實例和視圖不再有效。我可能在舊的視圖上調用remove()並實例化一個新的,但我的SomeCollectionView分層在現有的HTML(不是從模板構建)之上,調用remove從DOM中取出元素。而且,如果我的觀點能夠對變化事件作出簡單反應而不需要重建,我更願意。

回答

2

我做了像你說的東西(模型集合)從不同的「一面」,這將在這裏工作。當我有一個具有集合的模型時,我使用模型中的事件來創建集合。

class ModelA extends Backbone.Model 
    initialize: -> 
    bind("change", @initializeCollection) 

    initializeCollection: -> 
    if [email protected] 
     @collection = new Collection(@attributes.collection) 
    else 
     @collection.set(@attributes.collection) 

的其餘部分是相同的,所以我不會把它放在

此外,如果你走得更深: MODELA - > collecionB - > modelB - > collectionC - > modelC 比modelB在構造函數可以創建collectionC(提供您不要重複使用它)

[編輯] 我已經有了另一個想法:

class ModelA extends Backbone.Model 
    parse: (resp) -> 
    if @attributes.collection 
     @attributes.collection.set(resp.collection) 
     delete resp.collection 
    else 
     resp.collection = new Collection(resp.collection) 
    resp 
+1

整潔。然而,這種方法的缺點是你不能調用`model.get('collection')`,而是必須調用`model.collection`。我不是非常喜歡這種不對稱,但也許這是一個必要的罪惡。 – errcw 2011-12-15 05:30:53

相關問題