覆盖Ember成员函数时是否应始终包含this._super(... arguments)

时间:2019-02-08 22:52:01

标签: ember.js

在Ember.js中,有很多函数需要您在调用它们之前调用this._Super(... arguments)。文档中的quick example

import Component from '@ember/component';

export default Component.extend({
  didRender() {
    this._super(...arguments);
    console.log('I rendered!');
  }
});

在Ember中是否有不需要呼叫this._super()的情况?我问的原因是因为通常我会为我的控制器或路由写一些钩子,而我只是忘了调用this._super(...arguments),而据我所知,一切都一样。

在覆盖Ember中的任何成员函数之前,我应该始终包括一个super()方法吗?

3 个答案:

答案 0 :(得分:1)

是的。在一个长期丢失的线程中,有人曾经告诉我,覆盖方法不一定能通过semver来保证,因此,如果向当前不做任何事情的上游方法中添加了某些内容,则我应该始终调用super以避免将来出现异常。 >

答案 1 :(得分:1)

是的,您应该始终这样做。如果您不这样做,则ember将不会执行在后台处理内容的代码,这将导致您可能无法调试的奇怪行为。

P.S:作为实验,只需尝试在应用程序中的任何路由中覆盖setupController方法,而无需调用this._super(... arguments),然后看看会发生什么。

答案 2 :(得分:1)

是的,您最好包括this._super,尽管在大多数情况下不是“必须”。

我只有一个地方知道这是关键-init。如上所述,很可能也是constructor,但是我不需要覆盖构造函数。但是,请考虑以下问题:

  1. 许多人提到,将来的版本可能会有所更改,包括this._super可能有助于避免错误
  2. 如果您使用某些ember插件中的mixin,它们也可能会覆盖ember方法或在以后的版本中使用
  3. 假设您正在从自己的mixin扩展组件,现在您的mixin不会覆盖didRender。但是,如果您将来需要更改该怎么办?

因此,尽管在大多数情况下包括this._super并不重要,但无论如何都应包括在内。除非您打算完全覆盖默认行为,否则。