为什么我的 Marionette CollectionView 不能处理空集合?
我正在尝试在 CompositeView 中呈现 CollectionView (它是项目列表中每个项目中的任务列表)。一切正常,直到我将一个空集合传递给 CollectionView。集合允许为空;一个项目很容易没有分配任何任务。
Chrome显示的错误是
未捕获的类型错误:对象 [object Object] 没有“on”方法
传入的项目集合是有效的Backbone.Collection
,过滤方法返回的任务列表也是有效的TasksCollection
,这就是为什么我无法弄清楚为什么会显示上述错误的原因。
Marionette 的 CollectionView 可以接受一个空的集合(它有一个emptyView
属性),那么为什么传入一个会报错呢?我认为它正在尝试将事件绑定到应该“正常工作”的集合 - 只有模型不存在。
我的任务集合如下所示:
var TasksCollection = Backbone.Collection.extend({
model: TaskModel,
byProject: function(projectId) {
var matches = this.filter(function(task) {
return task.get('projectId') == projectId;
}, this);
return new TasksCollection (matches);
},
complete: function(state) {
return new TasksCollection (this.where({ complete: state }));
}
});
我的观点是这样的:
// Single task item
var TasksListView = Marionette.CollectionView.extend({
tagName: 'ul',
className: 'tasks nav nav-stacked nav-pills',
itemView: Minuteboy.views.TaskItem,
emptyView: Templates['partials/tasks-empty']
});
// Project item (should probably be a Layout or CompositeView)
var DashboardProject = Marionette.ItemView.extend({
tagName: 'article',
template: Templates['partials/dashboard-project'],
initialize: function() {
this.on('render', function() {
var tasks = AllProjectTasks.byProject(this.model.get('id')).complete(false);
this.$el.find('.tasks-wrapper').html(new TasksListView({
collection: tasks
}).render().el);
});
}
});
// Containing view with page title and container for projects list
var DashboardPage = Marionette.CompositeView.extend({
template: Templates['pages/dashboard'],
itemView: DashboardProject,
itemViewContainer: '#content'
});
最后,我像这样实例化页面视图:
var page = new DashboardPage({
collection: // A valid Backbone.Collection
});