我正在使用事件聚合器(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。
现在的问题是,我做错了什么或者一切都按预期工作了吗?有没有其他方法可以实现这一目标?
答案 0 :(得分:1)
您可以eMgr.on("test1", this.test, this)
执行this.test
this
作为上下文(请注意第三个参数)。这样您就可以访问您的视图"这个"范围,因此也适用于您的观点功能。
如果您更喜欢使用listenTo,那么您可以eMgr.listenTo(eMgr, "test1", this.test.bind(this))
。不过,我发现它更加冗余,不必要地冗长。