Marionette CompositeView为Collection中的每个Model而不是ItemView(Marionette Rails)渲染自己

基本上,我正在尝试将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) 

ItemView:

 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项目,所以这些视图实际上存在于不同的目录中。 我是否必须以另一种方式声明他们的订单或相互绑定他们?

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

TL; DR Marionette.CompositeView将自身用作项目视图类型(如果没有定义)。 在prototype上设置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的类型相同。 这是由Marionette在开头提到的逻辑引起的。

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

 class sm.Views.GreetingPicker extends Marionette.CompositeView initialize: -> @constructor::['itemView'] = sm.Views.WelcomeMessage