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-CLI 中将 Ember-I18n 的翻译放在哪里?

Ember.js 和玩!框架身份验证最佳实践

实体框架生成的类不在我需要的命名空间中,有没有办法在不重新生成的情况下更改它使用的命名空间?

php-cli执行命令访问laravel路由

php-cli执行命令访问laravel路由