Задать вопрос
@InfoLabs

Как сделать глобальный singleton config?

Не могу понять, как реализовать правильно изменяемый внешний объект (в данном случае конфигурация приложения)

При инициализации приложения, config.js записывает дефолтный конфиг из переменной на странице.
После этот файл подключается через импорт в другие модули приложения. И проблема в том, что при обновлении приложения с новым конфигом через функцию update(config), он не обновляется глобально (т.е во всех модулях). Использую singleton.

Может кто сталкивался и знает как правильно решить проблему?

index.js:
import { config, setConfig } from './config';

class App {
  constructor () {
    //-----
  }
  //------
  update(config) {
    let container = mount(this.el.offsetParent, el(this.config.container), this.el.nextSibling);

    setConfig(config);

    unmount(this.el.offsetParent, this.el);
    mount(container, new App());
  }
}

if(!config) {
  console.error('Не найдена конфигурация');
} else {
  let app = new App();
  let container = document.body.querySelector(config.container) || document.body;
  setTimeout(() => {
      app.update({
          //new config
      });
  }, 2000);

  try {
    mount(container, app);
  } catch(e) {
    console.error('[Example]', '[Module: ' + e.name + ']', e.message);
  }
}


config.js
let Singelton = (() => {
  let instance;

  return (() => {
    if(!instance) instance = {};
    return instance;
  })();
})();

Singelton.config = Object.assign({}, window.video_player_config) || null;
Singelton.setConfig = (_config) => {
  Singelton.config = _config;
};


export const config = Singelton.config;
export const setConfig = Singelton.setConfig;
  • Вопрос задан
  • 306 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@InfoLabs Автор вопроса
Переел видимо я сникерсов. В итоге нужно было взглянуть один раз на док.

Все довольно просто оказалось. И да, по умолчанию модули являются синглтонами, спасибо Negwereth .
config.js
let createConfig = (obj1, obj2) => {
  obj1 = obj1 || {
    state: {}
  };

  return Object.assign(obj1, obj2);
};

export let config = createConfig(null, window.video_player_config);

export const setConfig = (newConfig) =>  {
  config = createConfig(null, newConfig);
};


index.js
import { config, setConfig } from './config';
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Negwereth
@Negwereth
lvivcss.com.ua
1. ES модули уже синглтоны.
2. У вас аргумент метода называется так же, как и импорт конфига. Области видимости, вот это всё. Короче, конфиг в середине метода - личный для метода и к глобальному отношения не имеет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы