【问题标题】:Ember CLI: where to reopen framework classesEmber CLI:在哪里重新打开框架类
【发布时间】: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
  }
});

【问题讨论】:

    标签: ember.js ember-cli


    【解决方案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';。优点是您没有导入您不会使用的符号,这令人困惑。见stackoverflow.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';
    

    现在您的所有模型都有自定义代码。

    【讨论】:

      猜你喜欢
      • 2015-12-14
      • 2014-08-12
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      相关资源
      最近更新 更多