Javascript backbone.js视图继承`这是家长的决议

Javascript backbone.js视图继承`这是家长的决议,javascript,inheritance,view,backbone.js,Javascript,Inheritance,View,Backbone.js,我有一个使用视图继承的案例,我的代码基本上如下所示: parentView = Backbone.View.extend({ events: { "some event": "business" }, initialize: function(){ _.bindAll(this); }, business: function(e){ ... this.someFunc && t

我有一个使用视图继承的案例,我的代码基本上如下所示:

parentView = Backbone.View.extend({
    events: {
        "some event": "business"
    },
    initialize: function(){
        _.bindAll(this);
    },
    business: function(e){
        ...
        this.someFunc && this.someFunc();
        ...
     }
});

childView = parentView.extend({
    events: {
        ...
    },
    constructor: function(){
       this.events = _.extend( {}, parentView.prototype.events, this.events );
       parentView.prototype.initialize.apply( this );
    },
    initialize: function(){
       _.bindAll(this);
    },
    someFunc: function(){
       ...
    }
});
更新:将
此.events
扩展移动到构造函数

我的子视图中有
someFunc
,在父视图中的某些业务函数期间,如果该函数存在,它应该调用该函数。如果将
this
正确设置为childView,则应该存在
this.someFunc
。然而,这不是我正在经历的行为


初始化
功能期间(在父视图中),
确实设置为子视图。但是,当触发某个事件时,
business
函数被调用,而
this
设置为
parentView
您可以通过将此行添加到子级的initialize方法来解决此问题:

_.bind(this.business, this)
希望有人能给你指出一个比我能提供的更好的底层机制的描述,但我将尝试一下:

发生的情况是,除非另有说明,否则该方法将使用其定义的范围的上下文
initialize
在调用
parentView.prototype.initialize.apply(this)
时被告知使用子视图的上下文,因为您在子视图中传递了对apply方法的
this
引用

您可以使用上文所述的underline.js
bind
方法将业务方法绑定到子对象的上下文。

实际上,我不知道这是否解决了您的问题,但我通常会这样做:
this.constructor.\uu super\uuuu.initialize.apply(这是参数)并像一个符咒一样工作。我的解决方案是完全错误的。原因如下:

var Model1 = Backbone.Model.extend({
  method: function () {
    // does somehting cool with `this`
  }
});

var Model2 = Model1.extend({
  method: function () {
    this.constructor.__super__.method.call(this);
  }
});

var Model3 = Model2.extend({
  method: function () {
    this.constructor.__super__.method.call(this);
  }
});

var tester = new Model3();

// Boom! Say hallo to my little stack-overflowing recursive __super__ call!
tester.method();
调用
Model2::method
中的
this.constructor.\uuuuuuusuper\uuuu
将解析为(鼓点)
Model2::method


始终使用
ExplicitClassName.\uuuu super\uuuu.methodName.call(this,arg1,arg2/*…*/)
或Coffee脚本的
super

您是否尝试过在构造函数中而不是在初始化函数中扩展
this.events
?如果在初始化中执行此操作,则为时已晚;已在构造函数中设置了
业务
函数的事件委派,并将指向
父视图
(请参阅在主干.View的构造函数中调用
this.delegateEvents();

更新了一个工作示例:

ParentView = Backbone.View.extend({
    name: 'ParentView',
    events: {
        "event": "business"
    },
    business: function(e){
        this.someFunc && this.someFunc();
    }
});

ChildView = ParentView.extend({
    name: 'ChildView',
    events: {
    },
    constructor: function(){
       this.events = _.extend( {}, ParentView.prototype.events, this.events );
       console.debug( this.events );
       ParentView.prototype.constructor.apply( this, arguments );
    },
    someFunc: function(){
        console.debug('someFunc; this.name=%s', this.name);
    }
});

child = new ChildView();
$( child.el ).trigger('event');
// logs 'this' in 'someFunc'; the name is 'ChildView'.

是的,但这也是
..bindAll
函数的作用。通过在不使用任何额外参数的情况下使用它,它应该绑定到对象中的所有函数。不幸的是,这也不行。好吧,酷。你能告诉我parentView.prototype.initialize和parentView.constructor.initialize之间的区别吗?我更新了我的问题:即使使用这种技术,也存在同样的问题
parentView.constructor.initialize
未定义。我也尝试过:
parentView.prototype.constructor
,但运气不佳。更新了答案
parentView.constructor.initialize
是一个复制/粘贴错误,我的意思是
parentView.prototype.constructor
。为我工作!区别在于首先调用
构造函数
,并实际设置对象;通常,你不必去碰它<代码>构造函数
然后继续设置事件,最后调用
初始化
。我喜欢使用super而不是硬编码父类名称