EmberJS继承难题

Ric*_*nop 1 ember.js

考虑这种情况.我有一个共同的逻辑,我想在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计算属性?

Rya*_*yan 6

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