Cha*_*erj 40 inheritance backbone.js
我有一个视图Pannel,它只是一个带有关闭按钮的背景.我想将该视图扩展为一个名为PannelAdvanced.我怎么能用backbone.js做到这一点?
现在所有的例子都有,Backbone.View.Extend但只是延伸Backbone.View; 我想扩展我的PannelView.
Joh*_*ika 100
继承视图的最简单方法是执行其他人在评论中已经建议的内容:
var Pannel = Backbone.View.extend({
});
var PannelAdvanced = Pannel.extend({
});
Run Code Online (Sandbox Code Playgroud)
但是就像你在评论中提到的那样,如果你在Pannel中有一个初始化方法,那么如果你在PannelAdvanced中也有一个初始化方法就不会被调用,所以你必须明确地调用Pannel的初始化方法:
var Pannel = Backbone.View.extend({
initialize: function(options){
console.log('Pannel initialized');
this.foo = 'bar';
}
});
var PannelAdvanced = Pannel.extend({
initialize: function(options){
Pannel.prototype.initialize.apply(this, [options])
console.log('PannelAdvanced initialized');
console.log(this.foo); // Log: bar
}
});
Run Code Online (Sandbox Code Playgroud)
这有点难看,因为如果你有很多继承自Pannel的视图,那么你必须记住从所有这些视图中调用Pannel的初始化.更糟糕的是,如果Pannel现在没有初始化方法但你选择在将来添加它,那么你将来需要去所有继承的类并确保它们调用Pannel的初始化.所以这里是另一种定义Pannel的方法,这样你的继承视图就不需要调用Pannel的初始化方法:
var Pannel = function (options) {
// put all of Panel's initialization code here
console.log('Pannel initialized');
this.foo = 'bar';
Backbone.View.apply(this, [options]);
};
_.extend(Pannel.prototype, Backbone.View.prototype, {
// put all of Panel's methods here. For example:
sayHi: function () {
console.log('hello from Pannel');
}
});
Pannel.extend = Backbone.View.extend;
// other classes inherit from Panel like this:
var PannelAdvanced = Pannel.extend({
initialize: function (options) {
console.log('PannelAdvanced initialized');
console.log(this.foo);
}
});
var pannelAdvanced = new PannelAdvanced(); //Log: Pannel initialized, PannelAdvanced initialized, bar
pannelAdvanced.sayHi(); // Log: hello from Pannel
Run Code Online (Sandbox Code Playgroud)
Bri*_*sio 29
这是我喜欢使用Coffeescript的原因之一.像遗产这样的事情要好得多.为了捎带@ JohnnyO的正确答案,我可以在Coffeescript中说同样的话:
class Panel extends Backbone.View
initialize: ->
console.log 'Panel initialized'
@foo = 'bar'
class PanelAdvanced extends Panel
initialize: ->
super
console.log 'PanelAdvanced initialized'
console.log @foo
Run Code Online (Sandbox Code Playgroud)
再捎带一下:
我喜欢@ JohnnyO的方法,但是想确认一个结果视图仍然能够完成它应该做的一切.鉴于他的方法,我没有怀疑会有任何问题,但我想更加确定.
所以,我花了一分钟时间将Backbone.js Views测试套件改编为@JohnnyO提出的多重继承技术.
您可以在http://jsfiddle.net/dimadima/nPWuG/上运行结果.所有测试都通过.
我的基础和扩展视图:
var RegularView = function (options) {
// All of this code is common to both a `RegularView` and `SuperView`
// being constructed.
this.color = options && (options.color || 'Green');
// If execution arrives here from the construction of
// a `SuperView`, `Backbone.View` will call `initialize`
// that belongs to `SuperView`. This happens because here
// `this` is `SuperView`, and `Backbone.View`, applied with
// the current `this` calls `this.initialize.apply(this, arguments)`
Backbone.View.apply(this, arguments)
};
RegularView.extend = Backbone.View.extend;
_.extend(RegularView.prototype, Backbone.View.prototype, {
// Called if a `RegularView` is constructed`,
// Not called if a `SuperView` is constructed.
initialize: function () {
console.log('RegularView initialized.');
},
say_hi: function() {
console.log('Regular hi!');
}
});
var SuperView = RegularView.extend({
// Called if a `SuperView` is constructed`,
// Not called if a `RegularView` is constructed.
initialize: function(options) {
console.log('SuperView initialized.')
},
say_hi: function() {
console.log('Super hi!');
}
})
Run Code Online (Sandbox Code Playgroud)
对于测试套件,我从GitHub中获取了最新的视图测试,并替换了Backbone.Viewwith的出现次数RegularView.然后测试使用RegularView和结果,RegularView.extend()以确保两者都做他们应该做的.
| 归档时间: |
|
| 查看次数: |
23998 次 |
| 最近记录: |