在我的Backbone.js应用程序中,我有一个包含Collection的Model。为了支持从后端获取该模型,我重写了parse方法,将JSON响应中的数组转换为集合实例。它看起来像这样:
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
绑定到SomeCollection
的现有实例时,在调用SomeModel.fetch()
时,该实例被替换并且视图不再有效。我可以在旧视图上调用remove()
并实例化一个新视图但我的SomeCollectionView
在现有HTML(不是从模板构建)之上分层并调用remove pull out来自DOM的元素。此外,如果我的观点可以简单地对变化事件做出反应而不是需要重建,我更愿意。
答案 0 :(得分:2)
我做过像你说的那样的东西(模型中的集合)来自不同的“一面”,这里可以使用。当我有一个拥有Collection的模型时,我在模型中使用事件来创建集合。
class ModelA extends Backbone.Model
initialize: ->
bind("change", @initializeCollection)
initializeCollection: ->
if !@collection
@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