目标:我希望将基类中的侦听器附加到最顶层的继承实例。
问题:监听器附加到基类;因此,每次新的通话都会附加一个额外的听众。
详细信息:正如下面的代码片段所示,我正在使用require和backbone来创建我的对象 - 每个文件一个对象。 PrimaryObj
扩展midObj
,扩展baseObj
,扩展Backbone.Model
。
在视图(模板)中有一个字段和一个按钮,当点击它时,会调用loadThing
。用户可以使用新值填写该字段,然后每次都单击该按钮以加载新数据。
但是,每次构建一个新对象时,都会正确分配属性,但就像我得到一个引用到baseObj
(已经附加了一个监听器),而不是一个新的干净的副本/克隆(没有附加的监听器......)。
我想 this
中对baseObj
的引用会引用主要/扩展对象(primaryObj
),而不是baseObj
本身(这是似乎的地方,就像它被附加一样)。
如何将基础对象(baseObj
)中的侦听器附加到顶层对象(primaryObj
)?
谢谢!
main.js ---------------
require([ 'backbone', 'routers/router' ], function (Backbone, Router) {
window.DISPATCHER = _.clone(Backbone.Events);
var router = new Router();
Backbone.history.start();
});
baseObj.js ---------------
define([ 'backbone', 'underscore' ], function (Backbone, _) {
return Backbone.Model.extend({
initialize : function (p_thing) {
this.listenTo(window.DISPATCHER, "message", function (p_data) { /* some cool functionality */ });
}
});
});
midObj.js ---------------
define([ 'models/baseObj' ], function (BaseOBJ) {
return BaseOBJ.extend({
initialize : function () {
BaseOBJ.prototype.initialize.apply(this, arguments);
}
});
});
primaryObj.js ---------------
define([ 'models/midObj' ], function (MidOBJ) {
return MidOBJ.extend({
initialize : function (p_id) {
this.set({'ref' : p_id});
MidOBJ.prototype.initialize.apply(this, arguments);
}
});
});
myView.js ---------------
define([ 'jquery', 'underscore', 'backbone', 'primaryObj' ], function($, _, Backbone, MPrimary) {
return Backbone.View.extend({
events : { 'click .bLoad' : 'loadThing', },
initialize : function (p_options) {
this.listenTo(Backbone, 'obj:loaded', function () { this.render("device"); });
this.model = {};
},
loadThing : function (p_id) { this.model = new MDevice(p_id); },
render : function (p_target) { /* ... */ },
template : _.template(TModelTest)
});
});
答案 0 :(得分:0)
最后发现问题,如发布,并不是真正的问题。听众被正确处理但从未被清理过;因此,旧的' /原始对象正在收集垃圾,但它的听众(正确)没有。
如问题中所述,this.listenTo(Backbone, ...)
创建了与 Backbone 对象上的对象相关的侦听器,而不是创建的对象;然后,解决方案是显式删除主干对象上的侦听器。