考虑这种情况.我有一个共同的逻辑,我想在Ember.ArrayController和Ember.ObjectController实例中重用它.
Ember.ArrayController和Ember.ObjectController都是从一个基本的Ember.Object派生的,所以我尝试的是:
AbstractController = Ember.Object.extend({
// some methods with common logic
});
AbstractArrayController = AbstractController.extend({});
AbstractObjectController = AbstractController.extend({});
Run Code Online (Sandbox Code Playgroud)
问题是我还需要AbstractArrayController和AbstractObjectController来扩展它们的父级(Ember.ArrayController和Ember.ObjectController).
我怎样才能实现这种继承?
我正在考虑重新打开并重新打开类方法,也许它们可能很有用:http://emberjs.com/api/classes/Ember.Object.html#method_reopen
我尝试过这样的事情:
Ember.Object.reopenClass({
foo: function () {
return "foo";
}.property("foo")
});
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.
另一种解决问题的方法:
App.HelloController = Ember.ObjectController.extend({
foo: function () {
return "foo";
}.property("foo")
});
App.WorldController = Ember.ObjectController.extend({
foo: function () {
return "foo";
}.property("foo")
});
Run Code Online (Sandbox Code Playgroud)
如何抽象foo计算属性?
reopenClass在类对象上添加方法,而不是实例对象.当你这样做时:
Ember.Object.reopenClass({
foo: function () {
return "foo";
}.property("foo")
});
Run Code Online (Sandbox Code Playgroud)
你正在创造Ember.Object.foo().
reopen例如,如果要在实例级别使用方法,则需要使用Ember.Object.create().foo().
要回答你的问题,抽象许多类型的对象可以使用的函数的最佳方法是使用mixin.要创建一个mixin,你使用.
var mixin = Ember.Mixin.create({
foo: function() {
return 'foo';
}
});
Run Code Online (Sandbox Code Playgroud)
并让你的对象利用你可以使用的mixin.
var MyController = Ember.ObjectController.extend(mixin, {
// ...
});
Run Code Online (Sandbox Code Playgroud)
有关mixins的更多信息:http://codingvalue.com/blog/emberjs-mixins/和http://emberjs.com/api/classes/Ember.Mixin.html
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |