Marionette:渲染后设置集合不会在模型添加时更新
Marionette: setting collection after render doesn't update on model add
我有一个嵌套的复合视图,用于检查其模型中的集合,如果是,则将该集合设置为其自身作为其集合。
onRender: ->
if model.attributes.has_collection
@collection = model.get 'myCollection'
当模型有一个集合并且项目视图全部显示时,这非常有效,当我将新模型添加到集合中时,会出现一个新视图。
但是当没有集合,点击按钮创建一个新模型时,我需要创建模型,将集合(一个集合)设置为视图的模型,并让视图显示模型和添加的任何其他模型。我尝试了各种方法,现在我在模型上设置集合,然后 运行 这个函数:
class List.myCompositeView
childView: myView
// *** //
setChildren: ->
@collection = @model.get 'myCollection'
@render()
第一个模型会正常显示,但创建的更多模型不会显示。重复一下,当在 onRender 函数中设置集合时,它们确实会出现。我意识到有很多代码我没有在这里添加,所以如果有什么(可能)与您需要知道的问题相关,请告诉我。可能是视图没有正确绑定到集合的事件吗?谢谢!
A marionette collectionView 有一个名为 _initialEvents
的私有方法。构造 collectionView 时,它会将此方法设置为在第一次呈现视图时调用。如果您的第一次渲染是在未设置集合视图时,那么事件将无法正确连接是有道理的。设置集合后,您应该能够调用此私有方法,并且一切正常:@_initialEvents()
如果有帮助,这是该方法的实现:
if (@collection) {
@listenTo(this.collection, 'add', @_onCollectionAdd);
@listenTo(this.collection, 'remove', @_onCollectionRemove);
@listenTo(this.collection, 'reset', @render);
if (@getOption('sort')) {
@listenTo(@collection, 'sort', @_sortViews);
}
}
我有一个嵌套的复合视图,用于检查其模型中的集合,如果是,则将该集合设置为其自身作为其集合。
onRender: ->
if model.attributes.has_collection
@collection = model.get 'myCollection'
当模型有一个集合并且项目视图全部显示时,这非常有效,当我将新模型添加到集合中时,会出现一个新视图。
但是当没有集合,点击按钮创建一个新模型时,我需要创建模型,将集合(一个集合)设置为视图的模型,并让视图显示模型和添加的任何其他模型。我尝试了各种方法,现在我在模型上设置集合,然后 运行 这个函数:
class List.myCompositeView
childView: myView
// *** //
setChildren: ->
@collection = @model.get 'myCollection'
@render()
第一个模型会正常显示,但创建的更多模型不会显示。重复一下,当在 onRender 函数中设置集合时,它们确实会出现。我意识到有很多代码我没有在这里添加,所以如果有什么(可能)与您需要知道的问题相关,请告诉我。可能是视图没有正确绑定到集合的事件吗?谢谢!
A marionette collectionView 有一个名为 _initialEvents
的私有方法。构造 collectionView 时,它会将此方法设置为在第一次呈现视图时调用。如果您的第一次渲染是在未设置集合视图时,那么事件将无法正确连接是有道理的。设置集合后,您应该能够调用此私有方法,并且一切正常:@_initialEvents()
如果有帮助,这是该方法的实现:
if (@collection) {
@listenTo(this.collection, 'add', @_onCollectionAdd);
@listenTo(this.collection, 'remove', @_onCollectionRemove);
@listenTo(this.collection, 'reset', @render);
if (@getOption('sort')) {
@listenTo(@collection, 'sort', @_sortViews);
}
}