【问题标题】:How to extend Ember's Object?如何扩展 Ember 的对象?
【发布时间】:2014-01-14 10:57:11
【问题描述】:

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

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

例如:

如果视图的类名是ArticlesListView,那么它的关联模型是Article,控制器动作在ArticlesController内命名为list,模板在app/articles命名为list.js.hjs...

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

那么如何扩展核心 Ember 对象

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

    model: function(context, params){

    }
});

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    增强现有对象的一般问题的答案是使用reopen

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

    至于您的更具体的问题,这更具挑战性。对象通常不知道分配给它的属性的名称。您可以通过遍历命名空间的属性(包括App)并找到与当前类匹配的属性来实现您的目标。您可以缓存该属性名称以备将来使用。

    另一种方法是定义一个帮助方法来定义新模型、控制器等,您可以将名称传递给这些方法。该方法可以处理创建子类,将其分配给 App 的属性,并使用名称设置实例变量。

    【讨论】:

      【解决方案2】:

      基本上就像卢克写的那样,有一个实质性的不同。如果你这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        • 2013-08-03
        • 2011-08-23
        相关资源
        最近更新 更多