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({});

問題は、親 (Ember.ArrayController と Ember.ObjectController) から拡張するために、AbstractArrayController と AbstractObjectController も必要なことです。

この種の継承をどのように達成できますか?

私は今openとopenClassメソッドを見ています

私は次のようなことをやってみました:

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()

あなたの質問に答えるために、多くのタイプのオブジェクトが使用できる関数を抽象化する最良の方法は、ミックスインを使用することです。使用するミックスインを作成するには。

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

オブジェクトにその mixin を利用させるには、使用することができます。

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

ミックスインの詳細: http://codingvalue.com/blog/emberjs-mixins/およびhttp://emberjs.com/api/classes/Ember.Mixin.html

于 2013-10-22T13:20:36.877 に答える