我正在寻找一种方法来扩展Ember的Object以包含一些其他方法,以便它们在我的应用程序中的每个对象(View,ArrayController等)都可用。
具体来说,我想定义一些方法,介绍控制器,模型,视图,模板,帮助器等的一些命名约定。
例如:
如果视图的类名为ArticlesListView
,则其关联模型为Article
,控制器操作在list
内命名为ArticlesController
,模板位于{{ 1}}名为app/articles
...
最终结果应该是,例如list.js.hjs
将返回App.ArticlesListView.model()
。
所以如何扩展核心Ember对象?
App.Article
答案 0 :(得分:8)
增强现有对象的一般问题的答案是使用reopen
:
Ember.Object.reopen({
foo: function(){
return 'bar';
}
});
至于你更具体的问题,那就更具挑战性了。对象通常不知道它所分配的属性的名称。您可以通过遍历命名空间的属性(包括App
)来实现目标,并找到与当前类匹配的属性。您可以缓存该属性名称以供将来执行。
另一种方法是定义一个辅助方法,用于定义将名称传递给的新模型,控制器等。该方法可以处理创建子类,将其分配给App的属性,以及使用名称设置实例变量。
答案 1 :(得分: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({});