Ember CLI:重新打开框架类的位置

Joh*_*ika 23 ember.js ember-cli

我想重新打开Ember或Ember Data框架类.使用Ember CLI,在哪里放置这些以使它们获得初始化属性的正确位置?这是我想做的事情的一个例子:

import DS from 'ember-data';

DS.Model.reopen({
  rollback: function() {
    this._super();
    // do some additional stuff
  }
});
Run Code Online (Sandbox Code Playgroud)

GJK*_*GJK 22

我认为执行具有副作用的模块的最佳方法是创建初始化程序.像这样的东西:

// app/initializers/modify-model.js
import DS from 'ember-data';

let alreadyRun = false;

export default {
    name: 'modify-model',
    initialize() {
        if (alreadyRun) {
            return;
        } else {
            alreadyRun = true;
        }

        DS.Model.reopen({
            // ...
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

初始化程序由Ember-CLI自动运行,因此无需自行调用它们.

编辑:正如Karim Baaba指出的那样,初始化程序可能不止一次运行.为了方便,我已经包含了alreadyRun一面旗帜.


Kar*_*aba 18

使用初始化程序就足够了,但编写测试时并不是一个很好的做法,因为它们会多次运行.

以下是如何在focusIn触发 时重新打开文本字段视图以清除输入的示例app/overrides/textfield.js:

import Ember from 'ember';

export default Ember.TextField.reopen({
  focusIn: function(evt) {
    this._super(evt);
    this.set('value', '');
  }
});
Run Code Online (Sandbox Code Playgroud)

app/app.js

import './overrides/textfield';
Run Code Online (Sandbox Code Playgroud)

该模式非常简单,可以很容易地使用 DS.Model