对于EmberJs模型,建议不要覆盖`init`方法

时间:2016-03-22 18:16:30

标签: javascript ember.js

为什么建议不要super覆盖EmberJs模型对象init方法?

我实现了这段代码,它工作得很好(现在,我猜):

import Ember from 'ember';

export default Ember.Object.extend({
    init() {
        this._super();
        if (!this.get('type')) {
            this.set('type', this.get('typeDefault'));
        }
    },
});

init上的EmberJs文档是here

这是一篇不推荐它的文章。

https://dockyard.com/blog/2014/04/28/dont-override-init

2 个答案:

答案 0 :(得分:1)

覆盖init绝对没有问题。在某些情况下,你必须。常见的替代方法是使用init事件,但实际上应该调用此事件afterInit,因为它是在创建对象后调用的,并且在这种情况下使用set会导致观察者触发

这篇文章反驳了你所引用的文章:https://dockyard.com/blog/2015/10/19/2015-dont-dont-override-init

调用init的正确方法:

init(...args) {
    this._super(...args);
    // ...
}

或者如果您不使用Babel:

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

答案 1 :(得分:1)

在您引用的文章中引用了一些人不推荐它的原因。如果您忘记调用this._super(...args)并且您的父模型也会覆盖init函数,则不会调用父模型init!

只要你总是调用超级类,覆盖init函数就不会有害。