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.jsbind
方法将业务方法绑定到子对象的上下文。实际上,我不知道这是否解决了您的问题,但我通常会这样做: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而不是硬编码父类名称