【问题标题】:EmberJS Inheritance ConundrumEmberJS 继承难题
【发布时间】:2013-10-22 11:01:04
【问题描述】:

考虑这种情况。我有一个通用逻辑,我想在 Ember.ArrayController 和 Ember.ObjectController 实例中重用它。

Ember.ArrayController 和 Ember.ObjectController 都是从基本的 Ember.Object 派生的,所以我尝试类似:

AbstractController = Ember.Object.extend({
// some methods with common logic
});

AbstractArrayController = AbstractController.extend({});
AbstractObjectController = AbstractController.extend({});

问题是我还需要 AbstractArrayController 和 AbstractObjectController 从它们的父级(Ember.ArrayController 和 Ember.ObjectController)扩展。

我将如何实现这种继承?

我现在正在研究reopen 和reopenClass 方法,也许它们可能有用:http://emberjs.com/api/classes/Ember.Object.html#method_reopen

我试着做类似的事情:

Ember.Object.reopenClass({

    foo: function () {
        return "foo";
    }.property("foo")

});

但这似乎不起作用。

解决问题的另一种方式:

App.HelloController = Ember.ObjectController.extend({

    foo: function () {
        return "foo";
    }.property("foo")

});

App.WorldController = Ember.ObjectController.extend({

    foo: function () {
        return "foo";
    }.property("foo")

});

如何抽象出 foo 计算属性?

【问题讨论】:

  • 您是否尝试过扩展 Ember 的控制器并通过 mixin 添加代码?
  • @Thomas 我不知道 mixins。我刚刚尝试过,它可以工作;)谢谢。您可以将其发布为答案吗? Mixins 似乎是此类问题的正确解决方案。

标签: ember.js


【解决方案1】:

reopenClass 在类对象上添加方法,而不是在实例对象上。当你这样做时:

Ember.Object.reopenClass({
  foo: function () {
    return "foo";
  }.property("foo")
});

您正在创建Ember.Object.foo()

如果您想在实例级别使用方法,则需要使用reopen,例如Ember.Object.create().foo()

为了回答您的问题,抽象许多类型的对象可以使用的函数的最佳方法是使用 mixin。创建你使用的 mixin。

var mixin = Ember.Mixin.create({
  foo: function() {
    return 'foo';
  }
});

让你的对象利用你可以使用的 mixin。

var MyController = Ember.ObjectController.extend(mixin, {
  // ...
});

关于 mixins 的更多信息:http://codingvalue.com/blog/emberjs-mixins/http://emberjs.com/api/classes/Ember.Mixin.html

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 2020-01-17
    • 2015-12-30
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多