我知道JS并不是为了按照OOP"干净利落地处理继承而设计的,但我不知道Ember是否有办法解决这个问题。
在Ember中,我认为Ember.ObjectController.extend({...});
在某种程度上是继承,但并非完全 - 我们肯定可以添加我们自己的属性和方法,因此函数.extend({...})
,但我们可以&#39}# 34;覆盖"已存在的功能。我想知道是否有这样的解决方法。
如果我创建了一个基本控制器,我该如何定义我希望子控制器实现的功能?我有基本控制器(仅限理论代码):
App.BaseController = Ember.ObjectController.extend({
// Methods meant for a child controller to implement
abstractMethod1: null,
abstractMethod2: null,
virtualMethod1: function(){
...
},
actions: {
execute: function(){
if(this.get("abstractMethod1"))
this.get("abstractMethod1")();
...
if(this.get("abstractMethod2")
var x = this.get("abstractMethod2")();
}
}
});
然后我有一个实现控制器试图覆盖这些功能:
App.ImplementingController = App.BaseController.extend({
/* How would I implement abstractMethod1 and abstractMethod2 here!?
For virtualMethod1, how would I call something like base.virtualMethod1()
or super.virtualMethod1()?
*/
});
我发现自己创建了大量具有基本相同代码的控制器,除了模型的名称及其属性。能够在Ember中推出这个方案会很高兴。怎么办?
答案 0 :(得分:1)
实际上Ember做得非常好,你只是不要覆盖它并且它击中了基础实现。或者你确实覆盖了它,它会摧毁基础实现。 (这实际上是Mixins的工作方式,http://emberjs.com/api/classes/Ember.Mixin.html)如果你想点击base
函数,属性等,它只是用它来访问它(它实际上将两个类一起打碎,优先于扩展课程。
App.BaseController = Ember.ObjectController.extend({
a:'Base',
b:'Base',
acomp: function(){
return 'Base';
}.property(),
bcomp: function(){
return 'Base';
}.property(),
e:function(){
return 'Base';
},
f:function(){
return 'Base';
}
});
App.IndexController = App.BaseController.extend({
b:'Index',
c:'Index',
bcomp: function(){
return 'Index';
}.property(),
f:function(){
return 'Index';
},
actions:{
foo:function(){
console.log(this.e());
console.log(this.f());
}
}
});
App.IndexController....
a:'Base'
b:'Index',
c:'Index',
acomp: function(){
return 'Base';
}.property(),
bcomp: function(){
return 'Index';
}.property(),
e:function(){
return 'Base';
},
f:function(){
return 'Index';
},
actions:{
foo:function(){
console.log(this.e());
console.log(this.f());
}
}
});