如何将基础对象中的侦听器附加到顶部/扩展对象

时间:2015-01-28 06:29:17

标签: javascript backbone.js listener

目标:我希望将基类中的侦听器附加到最顶层的继承实例。

问题:监听器附加到基类;因此,每次新的通话都会附加一个额外的听众。

详细信息:正如下面的代码片段所示,我正在使用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)
    });
});

1 个答案:

答案 0 :(得分:0)

最后发现问题,如发布,并不是真正的问题。听众被正确处理但从未被清理过;因此,旧的' /原始对象正在收集垃圾,但它的听众(正确)没有。

如问题中所述,this.listenTo(Backbone, ...)创建了与 Backbone 对象上的对象相关的侦听器,而不是创建的对象;然后,解决方案是显式删除主干对象上的侦听器。