Marionette CollectionView が空のコレクションで機能しないのはなぜですか?
CompositeView 内で CollectionView をレンダリングしようとしています (これは、プロジェクトのリストの各項目内のタスクのリストです)。空のコレクションを CollectionView に渡すまで、すべて正常に動作します。コレクションは空にすることができます。プロジェクトにはタスクが割り当てられていないことがあります。
Chromeが表示するエラーは
キャッチされていない TypeError: オブジェクト [オブジェクト オブジェクト] にはメソッド '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
});