1

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
});
4

1 に答える 1

2

これは私の側のエラーでした。emptyViewCollectionViewのプロパティにある種のビュー オブジェクトを使用する代わりに、テンプレート (この場合はハンドルバー) を使用していました。私の作業 CollectionView は次のようになります。

var EmptyList = Marionette.ItemView.extend({
    tagName: 'li',
    template: Templates['partials/tasks-empty']
});

Minuteboy.views.TaskList = Marionette.CollectionView.extend({
    tagName: 'ul',
    className: 'tasks nav nav-stacked nav-pills',
    itemView: Minuteboy.views.TaskItem,
    emptyView: EmptyList
});

itemView次の行に注意してください。

itemView: Minuteboy.views.TaskItem

これはかつて

itemView: Templates['partials/tasks-empty']

どちらが悪いです。

于 2013-05-23T10:10:59.787 に答える