如何扩展Ember的对象?

时间:2012-02-11 07:36:17

标签: ember.js

我正在寻找一种方法来扩展Ember的Object以包含一些其他方法,以便它们在我的应用程序中的每个对象(View,ArrayController等)都可用。

具体来说,我想定义一些方法,介绍控制器,模型,视图,模板,帮助器等的一些命名约定。

例如:

如果视图的类名为ArticlesListView,则其关联模型为Article,控制器操作在list内命名为ArticlesController,模板位于{{ 1}}名为app/articles ...

最终结果应该是,例如list.js.hjs将返回App.ArticlesListView.model()

所以如何扩展核心Ember对象

App.Article

2 个答案:

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