Подтвердить что ты не робот

Ember CLI: где снова открывать каркасные классы

Я хотел бы снова открыть классы структуры Ember или Ember Data. Используя Ember CLI, где это подходящее место для их размещения, чтобы получить инициализированное свойство? Вот пример того, что я хотел бы сделать:

import DS from 'ember-data';

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

Ответ 1

Я думаю, что лучший способ выполнить модули с побочными эффектами - создать инициализатор. Что-то вроде этого:

// 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, поэтому их не нужно называть самостоятельно.

EDIT: Как отметил Карим Бааба, для инициализаторов можно запускать несколько раз. Для этого легко включить флаг alreadyRun.

Ответ 2

Использование инициализаторов является достаточным, но не является хорошей практикой для написания тестов, поскольку они выполняются несколько раз.

Вот пример того, как повторно открыть текстовое поле, чтобы очистить ввод при срабатывании 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

Ответ 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';

Теперь все ваши модели имеют собственный код.