bem-site / bem-forum-content-ru

Content BEM forum for Russian speak users
MIT License
56 stars 6 forks source link

Асинхронная загрузка моделей и вью #1188

Open o5e2e2 opened 7 years ago

o5e2e2 commented 7 years ago

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

Вопрос, куда прописать зависимость бандла от блоков без DOM-представления модели?

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

tadatuta commented 7 years ago

Не хватает информации, чтобы ответить на вопрос.

Вообще правильных вариантов ответа примерно 2:

  1. Если модель глобальная, а в качестве декларации страницы используется bemdecl.js, то можно прописать в него. Если же bemdecl.js генерируется автоматически по bemjson.js, то такой вариант, очевидно не подходит.
  2. Можно прописать в зависимости всем тем блокам, которые общаются с моделью.

Бонус: не очень правильный, но распространенный вариант — прописать в корневой родительский блок (root, page или как-он-там-на-проекте-называется).

o5e2e2 commented 7 years ago

Модели и вьюхи работают через message-bus к которому асинхронно подключаются. Никак не получалось прописать в page так, чтобы модели и вьюхи асинхронно инициализировались.

Как получилось сделать: 1) сборка на основе bem/project-stub;

2) index.bemjson.js:

{ block: 'page', mix: [ block: 'init-model'], ... }

3) init-model.js:

modules.require(['model'], function() {});

4) init-model.deps.js:

({ shouldDeps: [ 'model', /* зависимости модуля 'model', без этого почему-то не работает */ ] })

Решение получилось совсем неочевидное, но, видимо, более простое решение трудно придумать.