3

基本上,我试图将 CompositeView 呈现为带有表头的简单四列列表,其中集合中的每个模型都呈现为 a 并附加到 . 我正在密切关注Derick 的一个例子,只有一点点变化,但不幸的是得到了一些非常奇怪的结果。

视图不是渲染每个 itemView,而是引用自身并为集合中的每个项目重新渲染,生成一个新的表和表头。在此之前,它本身是在渲染复合视图。

我有一个itemView,它的模板是一组项目,以及一个引用它的compositeView,它是一个表

复合视图:

class App.module('Views.Parts').Index extends Backbone.Marionette.CompositeView
   template: 'parts/index'
   itemView: App.Views.Parts.Part
   tagName: 'table'
   itemViewContainer: 'tbody'
   appendHtml: (collectionView, itemView, index)->
           collectionView.$el.append(itemView.el)

项目视图:

class App.module('Views.Parts').Part extends Backbone.App.ItemView
       tagName: 'tr'
       template: 'parts/part'
       events:
               "click .destroy": "destroy"
       destroy: (e) ->
               e.preventDefault()
               @model.destroy()
       onRender: ->
               @stickIt()

控制器

class App.Controllers.Parts
       constructor: ->
               @parts = new App.Collections.Parts
               @parts.reset(App.parts)
               App.parts = null

       showView: (view)->
               App.mainRegion.show view

       index: ->
               view = new App.Views.Parts.Index
                       collection: @parts
               @showView view

我还听说有必要在 CompositeView 之前声明一个 ItemView ——但是,由于它是 Marionette Rails 项目,因此视图实际上位于不同的目录中。我是否必须宣布他们的订单或以另一种方式将他们相互绑定?

4

2 回答 2

2

你不想拥有itemViewContainerAND appendHtml。尝试删除后者,您的视图应该正确呈现。

于 2013-10-02T06:19:43.397 回答
2

TL;DR Marionette.CompositeView将自身用作项目视图类型(如果未定义)。在原型上设置 itemView 属性以使其使用正确的项目视图

问题

在我们的案例中,问题是 Marionette通过以下逻辑获取CompositeViewItemView

getItemView: function(item){
  var itemView = Marionette.getOption(this, "itemView") || this.constructor;

  if (!itemView){
    throwError("An `itemView` must be specified", "NoItemViewError");
  }

  return itemView;
}

我们将CompositeView定义为:

class sm.Views.GreetingPicker extends Marionette.CompositeView
  template: 'greeting_picker'
  el: '.message-choice'
  itemView: sm.Views.WelcomeMessage

当将它们绑定在一起的CompositeViewItemViewLayout放在一个文件中时(由 Rails 使用 Sprockets 提供服务),文件一次加载,没有问题。

在我拆分LayoutCompositeViewItemView之后,CompositeView的 appendHtml 的两个参数都与 CompositeView 的类型相同。这是由开头提到的秘偶逻辑造成的。

解决方案

在初始化程序中手动设置构造函数上的itemView属性。像这样:

class sm.Views.GreetingPicker extends Marionette.CompositeView
  initialize: ->
    @constructor::['itemView'] = sm.Views.WelcomeMessage
于 2013-11-18T13:54:14.807 回答