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

Should I always include this._super(...arguments) when overwriting an Ember member function

在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() 方法?

是的。在一个长期丢失的线程中,有人曾经告诉我,重写方法的行为不一定由 semver 保证,所以如果将某些东西添加到当前什么都不做的上游方法中,我应该始终调用 super 以避免将来出现奇怪情况。

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

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

是的,你最好包括 this._super,尽管在大多数情况下它不是 "a must"。

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

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

因此,虽然在大多数情况下包括 this._super 并不重要,但无论如何还是要包括它。除非您打算完全覆盖默认行为。