2012-02-11 9 views
3

私はEmberのオブジェクトを拡張して、いくつかのメソッドを追加し、アプリケーション内のすべてのオブジェクト(View、ArrayControllerなど)で使用できるようにする方法を探しています。ビューのクラス名があるEmberのオブジェクトを拡張するには?

場合:

具体的には、私は、など例えば

コントローラ、モデル、ビュー、テンプレート、ヘルパーのいくつかの命名規則を紹介し、いくつかのメソッドを定義したいですArticlesListView、その関連するモデルがArticleで、コントローラのアクションをArticlesControllerlist命名され、テンプレートがlist.js.hjs名前app/articlesである...

最終的な結果は、例えば、あるべきである、App.ArticlesListView.model()App.Articleを返します。

so どのようにコアのEmberオブジェクトを拡張しますか

Ember.Object.extend({  // <--- ??? 

    model: function(context, params){ 

    } 
}); 

答えて

8

既存のオブジェクトを向上させる一般的な質問への答えはreopenを使用することです:あなたのより具体的な質問については

Ember.Object.reopen({ 
    foo: function(){ 
     return 'bar'; 
    } 
}); 

、それはより困難です。オブジェクトは、通常、割り当てられているプロパティの名前については認識しません。ネームスペース(Appを含む)のプロパティをトラバースして、現在のクラスに一致するものを見つけることで目標を達成できるかもしれません。将来のパフォーマンスのためにそのプロパティ名をキャッシュすることができます。

もう1つの方法は、名前を渡す新しいモデル、コントローラなどを定義するヘルパーメソッドを定義することです。このメソッドは、サブクラスの作成、Appのプロパティへの割り当て、および名前を使用したインスタンス変数の設定を処理できます。

1

基本的には、ルークが書いたように、大きな違いが1つあります。そうした場合:

Ember.Object.reopen({ 
    foo: function(){ 
     return 'bar'; 
    } 
}); 

以上(延長しない - foo方法がすでに存在する場合)を置き換えるObjectのプロパティfoo

あなたはfooメソッドの元の実装を含めるために_super()を呼び出す必要がfooエンバーObjectのプロパティを拡張したい場合。

Ember.Object.reopen({ 
    foo: function(){ 
     this._super(); // include original `foo` method stuff here 
     return 'bar'; // then add to `foo` method whatever you want 
    } 
}); 

ところで、特定のインスタンスも拡張できます。 var someObject = Ember.Object.extend({}); someObject.reopen({});

関連する問題