1

考虑这种情况。我有一个通用逻辑,我想在 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({});

问题是我还需要 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")

});

但这似乎不起作用。

解决问题的另一种方法:

App.HelloController = Ember.ObjectController.extend({

    foo: function () {
        return "foo";
    }.property("foo")

});

App.WorldController = Ember.ObjectController.extend({

    foo: function () {
        return "foo";
    }.property("foo")

});

如何抽象 foo 计算属性?

4

1 回答 1

6

reopenClass在类对象上添加方法,而不是实例对象。当你这样做时:

Ember.Object.reopenClass({
  foo: function () {
    return "foo";
  }.property("foo")
});

您正在创建Ember.Object.foo().

如果要在实例级别使用方法,则需要使用reopen,例如Ember.Object.create().foo().

要回答您的问题,抽象许多类型的对象可以使用的函数的最佳方法是使用 mixin。创建一个你使用的mixin。

var mixin = Ember.Mixin.create({
  foo: function() {
    return 'foo';
  }
});

并让您的对象利用您可以使用的 mixin。

var MyController = Ember.ObjectController.extend(mixin, {
  // ...
});

更多关于 mixins:http ://codingvalue.com/blog/emberjs-mixins/和http://emberjs.com/api/classes/Ember.Mixin.html

于 2013-10-22T13:20:36.877 回答