2012-02-11 52 views
3

我正在尋找一種方法來擴展Ember的對象,以包含一些額外的方法,以便它們在我的應用程序中變爲可用的每個對象(視圖,ArrayController等)。如何擴展Ember的對象?

具體來說,我想定義一些方法介紹了控制器,模型,視圖模板,傭工的一些命名約定,等

例如:

如果View的類名ArticlesListView那麼其關聯的模型是Article,控制器動作被命名爲內ArticlesControllerlist,模板是app/articles命名list.js.hjs ...

最終的結果應該是,例如,App.ArticlesListView.model()將返回App.Article

所以如何擴展核心Ember對象

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

    model: function(context, params){ 

    } 
}); 

回答

8

答案加強現有對象的普遍的問題是使用reopen

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

至於你更具體的問題,這是更大的挑戰。一個對象通常不知道分配給它的屬性的名稱。通過遍歷名稱空間的屬性(包括App)並找到與當前類相匹配的名稱,可以實現目標。您可以緩存該屬性名稱以備將來使用。

另一種方法是定義一個幫助器方法來定義將名稱傳入的新模型,控制器等。該方法可以處理創建子類,將其分配給App屬性,並使用名稱設置實例變量。

1

盧克基本上寫道,有一個實質性的區別。如果你這樣做:

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

以上更換(不擴展 - 如果foo方法已經存在)Object的財產foo

如果要擴展Ember Object的屬性foo,則需要調用_super()以包含foo方法的原始實現。

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