1

我正在使用 Backbone.Marionette 的 CompositeView,我想在集合的索引 0 处插入一个新模型,并将其显示为组合中的第一个视图。

我有这个代码来插入元素:

PlansApp.Plans.collection.unshift new PlansApp.Plan data

问题是 CompositeView 忽略了集合中新插入项目的索引。

在 Backbone.Marionette 中,appendHtml 方法如下所示:

  appendHtml: function(collectionView, itemView, index){
    collectionView.$el.append(itemView.el);
  },

index 参数从未使用过。

新插入的视图将始终放置在合成的末尾。

我怎样才能让它出现在位置 0?

4

2 回答 2

3

这是设计使然,因为在直接支持排序集合时已识别出大量边缘情况。

添加了该index参数,以便开发人员可以在其应用程序中单独添加支持。有一个 wiki 页面显示了如何执行此操作的示例:https ://github.com/derickbailey/backbone.marionette/wiki/Adding-support-for-sorted-collections


MySortedView = Backbone.Marionette.CompositeView.extend({
  // ...,

  appendHtml: function(collectionView, itemView, index){
    var childrenContainer = $(collectionView.childrenContainer || collectionView.el);
    var children = childrenContainer.children();
    if (children.size() === index) {
      childrenContainer.append(itemView.el);
    } else {
      childrenContainer.children().eq(index).before(itemView.el);
    }
  }

});
于 2012-07-11T13:59:08.220 回答
0

最初的 Derick 的回答对于当前版本的 Marionette 来说有点过时,并且 wiki 仅包含一个 collectionview 的示例。

这是我目前用于复合视图的内容:

appendHtml: (collectionView, itemView, index) ->
  $container = @getItemViewContainer(collectionView)
  if index is 0
    $container.prepend itemView.el
  else
    childAtIndex = $container.children().eq(index)
    if childAtIndex.length
      childAtIndex.before itemView.el
    else
      $container.append itemView.el
于 2014-05-28T10:38:11.323 回答