Marionette Collection View,获取集合不会触发事件

时间:2013-03-01 12:21:19

标签: javascript backbone.js view collections marionette

我遇到了问题:我的CollectionView无法呈现我的ItemViews。我将一个集合从布局传递到集合视图。我在CollectionView

中获取该集合

在布局中:

    // Create a a collection for the view
    this.articles = new Articles(null, {
        organizationId : this.model.organizationId,
        projectId : this.model.id
    });

    var articlesView = new ArticleCollectionView({ collection : this.articles});
    this.articlesRegion.show(articlesView);

在CollectionView中:

define([
    'marionette',
    'templates',
    'i18n!nls/projectDashboard',
    'views/projectDashboard/ArticleItem'
], function (Marionette, templates, msg, ArticleItemView) {

    return Marionette.CollectionView.extend({

        initialize : function () {
            this.listenTo(this.collection, "reset", this.render);
            this.collection.fetch();
        },

        itemView : ArticleItemView

    });

});

在ItemView中:

define([
    'marionette',
    'templates',
    'models/Article'
],
function (Marionette, templates, Article) {

    return Marionette.ItemView.extend({

        initialize : function () {
            console.log('itemviewrender');
        },

        template : templates.projectDashboard.articleItem
    });

});

一般情况下,设置正常。我找到了一种方法来实现这一点:在布局中获取集合并在成功回调中显示区域中的CollectionView

但是在collectionView上为集合添加侦听器失败了。对于像

这样的命令式和声明式听众,没有任何事件被触发
this.collection.on('reset', this.render, this);

collectionEvents : {
  'reset' : 'render'
}

我只想重新呈现集合View with it item item如果获取集合的话。我相信我错过了什么。任何帮助表示赞赏!

更新:我发现了一些有趣的东西: 我已经说过如果我在布局中获取集合并在成功回调上创建collectionView就可以了。有趣的是:如果我传递获取的集合,听众也会工作。我通过再次调用this.collection.fetch()中的initialize来触发它们。然后重新渲染工作。它必须是布局中集合传递的内容。

1 个答案:

答案 0 :(得分:2)

您想使用collectionEvents

以下是Marionette Docs的一个例子

 Marionette.CollectionView.extend({
   collectionEvents: {
    "sync": "render"
   }
 });

在示例中,当从后端

完全填充集合时,将触发渲染

modelEvents and collectionEvents