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

时间:2014-11-26 17:04:02

标签: 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
  }
});

3 个答案:

答案 0 :(得分:22)

我认为执行具有副作用的模块的最佳方法是create an initializer。像这样:

// 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({
            // ...
        });
    }
};

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

编辑:正如Karim Baaba指出的那样,初始化程序可能不止一次运行。为了方便解决这个问题,我添加了一个alreadyRun标记。

答案 1 :(得分:18)

使用初始化程序就足够了,但在编写测试时不是一个很好的做法multiple times

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

import Ember from 'ember';

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

app/app.js

import './overrides/textfield';

模式非常简单,可以轻松用于DS.Model

答案 2 :(得分:4)

将您的内容导出为ES6模块:

import DS from 'ember-data';

export default DS.Model.reopen({
  rollback: function() {
    this._super();
    // do some additional stuff
  }
});

将包含重新打开内容的文件放在app/custom/model.js之类的地方,然后将文件导入app/app.js,如下所示:

import SuperModel from './custom/model';

现在所有型号都有自定义代码。