【发布时间】:2012-11-26 23:42:23
【问题描述】:
我正在使用 Backbone 进入更大规模的数据结构,并且遇到了可以通过 CompositeViews 很好地表示数据的情况;也就是说,CollectionViews 在它们周围添加了“添加绒毛”,例如标题、按钮等。
但是,我在将 CompositeView 相互嵌套时遇到了很多困难。使用 CompositeView 上的标准 itemView 属性来呈现另一个 CompositeView 似乎根本没有触发。
假设我有一个 父 ItemView,以这样的方式实例化(在 Derick Bailey's example 之后;假设此顶层是调用集合中初始 fetch() 的位置):
var User = Backbone.Model.extend({});
var UserCollection = Backbone.Collection.extend({
model: User
});
var userList = new UserCollection(userData);
var schedulerCompositeView = new SchedulerCompositeView({
collection: userList
});
schedulerCompositeView.render();
this.ui.schedulerWidget.html(schedulerCompositeView.el);
SchedulerCompositeView 看起来像这样:
return Backbone.Marionette.CompositeView.extend({
template: Handlebars.compile(schedulerCompositeViewTemplate),
itemView: SchedulerDetailCompositeView,
appendHtml: function (collectionView, itemView) {
collectionView.$("#schedulerGroups").append(itemView.el);
}
});
最后,SchedulerDetailCompositeView:
return Backbone.Marionette.CompositeView.extend({
template: Handlebars.compile(schedulerDetailCompositeViewTemplate),
itemView: SchedulerDetailItemView,
appendHtml: function (collectionView, itemView) {
collectionView.$("#schedulerDetailStops").append(itemView.el);
}
});
SchedulerDetailCompositeView 永远不会被实例化;事实上,它的appendHtml() 方法似乎根本不会触发。
显然这里缺少一些其他信息;显然目的是将集合/模型传递给 SchedulerDetailCompositeView,但由于嵌套的 CompositeViews,我不确定这样做的正确技术是什么。
作为参考,这是我想要实现的结构的粗略模型;如果有比嵌套 CompositeViews 更好的方式来实现这个目标,我当然会全神贯注:
【问题讨论】:
-
在 SchedulerDetailCompositeView 初始化函数中,您将明确地为 this.collection 分配一个值,即告诉复合视图它处理的集合。就像在这个treeviewfiddle
-
这似乎没有足够的信息。即使在通过 initialize 方法分配集合之后,SchedulerDetailCompositeView 上的 appendHtml 也不会真正触发。 Initialize 会,但 appendHtml 不会。
标签: javascript jquery backbone.js marionette