在覆盖 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
,如上所述,但我从来不需要覆盖构造函数。但是,考虑一下:
- 正如许多人提到的那样,未来的版本可能会更改一些内容,包括
this._super
可能有助于避免错误
- 如果您使用来自某些 ember 插件的 mixin,它们也可能会覆盖 ember 方法或在未来的版本中使用
- 假设您正在从您自己的 mixin 扩展组件,现在您的 mixin 不会覆盖
didRender
。但是,如果您将来需要更改它怎么办?
因此,虽然在大多数情况下包括 this._super
并不重要,但无论如何还是要包括它。除非您打算完全覆盖默认行为。
在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
,如上所述,但我从来不需要覆盖构造函数。但是,考虑一下:
- 正如许多人提到的那样,未来的版本可能会更改一些内容,包括
this._super
可能有助于避免错误 - 如果您使用来自某些 ember 插件的 mixin,它们也可能会覆盖 ember 方法或在未来的版本中使用
- 假设您正在从您自己的 mixin 扩展组件,现在您的 mixin 不会覆盖
didRender
。但是,如果您将来需要更改它怎么办?
因此,虽然在大多数情况下包括 this._super
并不重要,但无论如何还是要包括它。除非您打算完全覆盖默认行为。