木偶 - 听从集合触发的自定义事件

时间:2015-06-19 07:27:51

标签: javascript backbone.js marionette

我正在使用事件聚合器(EA)来跟踪我的应用中的所有事件。但有一种情况我无法让EA听取从集合触发的自定义事件。请参阅下面的详细信息。

eMgr (事件管理员,即事件聚合器)

define(['backbone.wreqr'],function(Wreqr){
    "use strict";
    return new Wreqr.EventAggregator();
})

系列:

define([ 'underscore',  'backbone', 'eMgr', 'models/MainMenu/MM.model.category'], function(_, Backbone, eMgr, m_Category){
  var CategoriesCollection = Backbone.Collection.extend({
    model: m_Category,

    initialize: function(options) {
        console.log('CategoriesCollectionView initialized...');
        this.url= 'test1';
        this.fetch().then(function(){
            eMgr.trigger("test1")
        })
    }

  });

  return CategoriesCollection;
});

LayoutView:

define([ 'backbone', 'underscore', 'marionette', 'eMgr',
            'templates/template.mainmenu', 
            'collections/MainMenu/MM.collection.categories',
            'layouts/MainMenu/collectionview.categories'    ],
    function (Backbone, _, Marionette, eMgr, template, c_Categories, cv_Categories) {
    "use strict";
    var CategoryLayoutView = Marionette.LayoutView.extend({

        template: template['categories.layout'],

        regions: {
            categories : '#categories'
        },

        id: 'categories-layout',

        initialize: function(options){
            var r_categories = this.categories;
            this.listenTo(eMgr, "test1", this.test);
            this.categories = new c_Categories(options)
        },

        test: function(){
            console.log("test");
            var categories_layout = new cv_Categories({ collection: this.categories});
            categories_layout.render()
        },

        onRender: function(){
        },

        onShow: function(){

        }
    });

    return CategoryLayoutView;
});

如上所示,我想要实现的是在集合加载完所有数据后渲染CollectionView(cv_Categories)。

然而,除非我按以下方式收听事件,否则它不起作用:

eMgr.listenTo(eMgr, "test1", this.test);

这将触发该函数,虽然我不再能够访问我的LayoutView的方法/变量等等。所以我无法访问我的集合,因此无法正确启动我的CollectionView。

现在的问题是,我做错了什么或者一切都按预期工作了吗?有没有其他方法可以实现这一目标?

1 个答案:

答案 0 :(得分:1)

您可以eMgr.on("test1", this.test, this)执行this.test this作为上下文(请注意第三个参数)。这样您就可以访问您的视图"这个"范围,因此也适用于您的观点功能。

如果您更喜欢使用listenTo,那么您可以eMgr.listenTo(eMgr, "test1", this.test.bind(this))。不过,我发现它更加冗余,不必要地冗长。