2012-02-11 99 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({});