Что, если вам нужно одно место, где вы можете получить доступ ко всем своим константам в Ember? Мы хотим писать четкий и лаконичный код, и если у нас есть большой проект, в котором каждый файл содержит более 1000 строк кода, мы бы хотели разделить константы в другом файле, верно? В любом случае, модульность кода является хорошей практикой.

Одна вещь, которую вы можете сделать, это объявить константы как глобальные переменные. Это неплохо, но не считается лучшей практикой, потому что мы можем не использовать их во всех наших компонентах, маршрутах или контроллерах, а их активное использование во всей программе может занять драгоценную память. Мы бы хотели найти решение, в котором было бы эффективно и удобно внедрять эти константы в те места, где нам нужно получить к ним доступ.

Вот здесь-то и вступают в действие внедрения сервисов с использованием инициализаторов. Более подробную информацию о внедрении сервисов с помощью инициализаторов можно найти здесь, в руководстве по Ember.

Суть в том, что вы можете создать службу и инициализатор с помощью команды Ember CLI в терминале в корне вашего приложения Ember:

ember g service constants
ember g initializer constants

Вы можете заменить константы своим сервисом и именем инициализатора. Затем в своем сервисе вы можете создавать свои константы:

// services/constants.js
import Ember from ‘ember’;
export default Ember.Service.extend({
  chickens: 0,
  eggs: 0
});
// initializers/constants.js
export function initialize(application) {
  application.inject(‘route’, constants, ‘service:constants’);
};
export default {
  name: ‘constants’,
  initialize: initialize
};

Второй параметр в вышеприведенном методе inject — это имя свойства, к которому вы будете обращаться в своих маршрутах, например:

// routes/access-constants.js
import Ember from ‘ember’;
export default Ember.Route.extend({
  setupController(controller, model) {
     // Call _super for default behavior
     this._super(controller, model);
     // Implement your custom setup after
     this.controller.set(“chickensCount”, “constants.chickens”);
     this.controller.set(“EggsCount”, “constants.eggs”);
  }
});

Дополнительная информация о setupController для тех из вас, кому интересно.

Если вы хотите узнать о других способах объявления и использования констант, посмотрите этот обсуждаемый пост.

Мне очень нравится такой способ внедрения сервисов во все роуты (их можно инжектить и в компоненты и в контроллеры), потому что это более удобно и вам не нужно инжектить эти сервисы по отдельности в каждое место, где они вам нужны. Они будут вводиться из инициализатора, и это плюс модульности и лаконичности кода.