Ember CLI:在哪里重新打开框架类
Posted
技术标签:
【中文标题】Ember CLI:在哪里重新打开框架类【英文标题】:Ember CLI: where to reopen framework classes 【发布时间】:2015-01-25 02:52:06 【问题描述】:我想重新打开 Ember 或 Ember Data 框架类。使用 Ember CLI,在哪里放置这些以获取初始化属性的正确位置?这是我想做的一个例子:
import DS from 'ember-data';
DS.Model.reopen(
rollback: function()
this._super();
// do some additional stuff
);
【问题讨论】:
【参考方案1】:我认为执行具有副作用的模块的最佳方法是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
标志。
【讨论】:
这似乎太老套了。 @KarimBaaba 的解决方案似乎更干净。 Karim Baaba 的解决方案仅适用于某些场景,因为并非所有框架类都直接使用。它还强制您创建新别名或放弃内置别名。我并不是说这是一个糟糕的解决方案,但在许多情况下它要么不起作用,要么非常麻烦。总的来说,我同意你的看法——我讨厌修改库功能。【参考方案2】:使用初始化程序就足够了,但不是编写测试的好习惯,因为它们运行在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
【讨论】:
由于您只是重新打开 TextField,而不是创建一个新的,我想说您不需要导出它,这使事情更加清晰。那么你的导入语句就是:import './overrides/textfield';
。优点是您没有导入您不会使用的符号,这令人困惑。见***.com/a/34628888/647991
如果我正在开发(内部)插件,我会将import './overrides/textfield'
放在哪里【参考方案3】:
将您的内容导出为 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';
现在您的所有模型都有自定义代码。
【讨论】:
以上是关于Ember CLI:在哪里重新打开框架类的主要内容,如果未能解决你的问题,请参考以下文章
我在 Ember-CLI 中将 Ember-I18n 的翻译放在哪里?