【问题标题】:Marionette: setting collection after render doesn't update on model add木偶:渲染后设置集合不会在模型添加上更新
【发布时间】:2015-11-20 13:44:21
【问题描述】:

我有一个嵌套的复合视图,它检查它的模型是否有一个集合,如果是,则将该集合设置为它自己的集合。

onRender: ->
  if model.attributes.has_collection
    @collection = model.get 'myCollection'

当模型有一个集合并且项目视图全部显示时,这非常有效,当我向集合中添加一个新模型时,会出现一个新视图。

但是当没有collection,点击按钮新建model时,我需要创建model,将collection(一个集合)设置为view的model,获取view展示m​​odel以及添加的任何其他模型。我尝试了各种方法,现在我在模型上设置了集合,然后运行这个函数:

class List.myCompositeView
  childView: myView
  // *** //
  setChildren: ->
    @collection = @model.get 'myCollection'
    @render()

第一个模型按原样显示,但不显示创建的其他模型。重复一遍,当集合在 onRender 函数中设置时,它们确实会出现。我意识到有很多我没有在这里添加的代码,所以如果有一些(可能)与你需要知道的问题相关的东西,请告诉我。可能是视图没有正确绑定到集合的事件吗?谢谢!

【问题讨论】:

    标签: backbone.js marionette composite-view


    【解决方案1】:

    木偶 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);
      }
    }
    

    【讨论】:

    • 感谢您的回复!刚开始尝试这个,事情就更接近了,但还没有完全展开。我设置集合并注销视图以检查它:集合长度为 1,子视图长度为 0。每次单击添加按钮时,每个的长度都会增加 1(所以我会看到所有新的子视图)。基本上,不会为第一个创建新的子视图。
    • 现在我设置集合,渲染复合视图,然后调用 @_initialEvents() 以保持其他一切正常进行。我担心我可能会使它过于复杂,并且不确定@render() 是否有任何我应该避免的负面影响,但它确实是一个好地方:) 再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2013-08-02
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多