gpt4 book ai didi

ember.js - Ember : adding a mixin to a class after it's been created

转载 作者:行者123 更新时间:2023-12-03 06:36:43 24 4
gpt4 key购买 nike

我想将 mixin 添加到已创建的 Ember 类中。 (该类是在库中定义的,实际上是 Ember 本身;它是 LinkView )。

我发现我们可以做mixin.apply(obj) ,但这会将 mixin 应用于该类的实例。我想将 mixin 添加到类中,这样它就会自动混合到所有新创建的对象中。

我试图覆盖 init类的方法,使用 reopenClass ,并执行 mixin.apply(this)在那里,将 mixin 应用到实例,然后调用原始 init方法,但这似乎不起作用,因为 mixin 接线是在 init 中设置的方法,当我能找到它时已经太晚了。

reopenClass似乎不接受像 extend 这样的 mixin 参数做。它的代码似乎表明它正在使用 mixin 做一些事情,但无论它是什么,它都不起作用:

a = Ember.Object.extend().reopenClass(Ember.Mixin.create({mixval: 1});
a.create().get('mixval'); // undefined

我知道我可以使用 MyLinkView = Ember.LinkView.extend(mixin, ... 创建自己的类,但不幸的是原始类名在库中显式引用,所以我真的更愿意弄清楚如何使用我的 mixin 扩展该原始类。

我尝试过Ember.LinkView = Ember.LinkView.extend(mixin, ... 。尽管这似乎有效,但在某种程度上似乎很危险。但在这种特殊情况下,它对我没有帮助,因为 Ember 代码中的引用(在 {{link-to}} 帮助器的定义中)是类的内部版本,而不是完全限定的 Ember.LinkView .

有什么想法吗?

最佳答案

解决办法很简单

Klass = Parent.extend({init: {...}});
Mixin = Ember.Mixin.create({init: {...}});
Klass.reopen(mixin);

一切都按预期进行,包括 super 链。换句话说,对 Klass.create().init() 的调用将调用 mixin 的 init,从那里调用 super 将调用原始的 Klass#init.

在研究这个问题的过程中,我发现了一些关于reopen的有趣的事情。即使参数不是 mixin,它也会被视为一个 mixin(在内部,它实际上创建了一个临时的)。这意味着如果您这样做

Klass.reopen({
init: function() {
this._super.apply(this, arguments);
}
});

super的调用实际上是调用原来的init,而不是父类中的init。换句话说,在 reopen 中指定 init 不会替换类上现有的 init,它更多或上面的层数更少。我在 Ember 文档的任何地方都看不到这种行为的记录,但它在正确的情况下似乎确实很有用。

关于ember.js - Ember : adding a mixin to a class after it's been created,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24927084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com