烬控制器和“虚拟”和/或“abstract"方法
Ember Controllers and "virtual" and/or "abstract" methods?
我知道JS并不是为了"干净地"处理每个OOP的继承而设计的,但我想知道Ember是否有办法做到这一点。
在Ember中,我认为Ember.ObjectController.extend({...});
是某种程度上的继承,但不是完全继承——我们当然可以添加我们自己的属性和方法,因此函数.extend({...})
,但我们不能"覆盖"已经存在的函数。我想知道是否有这样的解决方法。
如果我创建了一个基本控制器,我将如何定义我希望子控制器实现的函数?我有基本控制器(理论代码):
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做得很好,你只是不重写它,它击中基本实现。或者你重写它,它会清除基本实现。(这基本上是如何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());
}
}
});
Ember组合后的样子
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());
}
}
});
http://emberjs.jsbin.com/wuhuleje/2/edit 相关文章:
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- "工具提示"jQuery插件坏了
- "锻造;React中的表达式
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- 如何提取“;href"最近列表项中的属性值
- CKEditor如何允许href="javascript:void(0)"在小部件中
- 插入“;img src"在javascript中