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项目,所以这些视图实际上存在于不同的目录中。 我是否必须以另一种方式声明他们的订单或相互绑定他们?
你不想拥有appendHtml
和appendHtml
。 尝试删除后者,您的视图应该正确呈现。
TL; DR Marionette.CompositeView将自身用作项目视图类型(如果没有定义)。 在prototype上设置itemView属性,使其使用正确的项目视图
问题
在我们的案例中,问题是Marionette通过以下逻辑获取CompositeView的ItemView :
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
当将它们绑在一起的CompositeView , ItemView和Layout放在一个文件中(由Rails使用Sprockets提供)时,文件一次加载并且没有问题。
在我拆分Layout , CompositeView和ItemView之后 , CompositeView的appendHtml的两个参数与CompositeView的类型相同。 这是由Marionette在开头提到的逻辑引起的。
解
在初始化程序中,手动设置构造函数上的itemView属性。 像这样:
class sm.Views.GreetingPicker extends Marionette.CompositeView initialize: -> @constructor::['itemView'] = sm.Views.WelcomeMessage
- Backbone.js和Rails – 如何处理Backbone模型中的参数?
- 使用rspec和capybara测试rails + backbone应用程序
- rails-backbone gem中的EJS和JST模板文件的格式
- Ajax队列Backbone js
- Backbone.js路由器实例在某种程度上是无效的
- Rails,Backbone,PhoneGap,CORS(Access-Control-Allow-Origin错误不允许)
- 如何使用Rails,Devise和Backbone.js进行令牌认证?
- 从Backbone检索rails / devise current_user
- Marionette.js与Rails(设计)认证