我想重新打开Ember或Ember Data框架类。使用Ember CLI,在哪里放置这些以使它们获得初始化属性的正确位置?这是我想做的事情的一个例子:
import DS from 'ember-data';
DS.Model.reopen({
rollback: function() {
this._super();
// do some additional stuff
}
});
答案 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';
现在所有型号都有自定义代码。