В последнее время я вижу большой энтузиазм в сообществах React и Vue по поводу Suspense API. Suspense предлагает компонент, который позволяет вам «ждать» отрисовки некоторого кода и декларативно указывать состояние загрузки (например, счетчик), которое отображается до тех пор. Вот пример из Vue:

Если вы не знакомы с задержкой, рекомендую прочитать эти статьи.

Увидев это, я сказал себе, что попробую сделать что-то подобное в Angular. В этой статье я хочу поделиться тем, что я создал, на что у меня ушло около 20 минут 😀

Подход, который я использовал, похож на тот, который использует Vue, поскольку он больше похож на Angular. Вот чего мы хотим достичь:

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

Если вы не знакомы с отложенной загрузкой компонентов с помощью Ivy, я рекомендую прочитать следующую статью:



Давайте начнем. Сначала создадим директиву defaultView:

Это простая директива, которая принимает на вход фабричную функцию, которая выбирает компонент. Перейдем к директиве fallbackView:

Единственная цель этой директивы - предоставить ссылку на шаблон, чтобы мы могли использовать ее в родительском компоненте приостановки. Директива errorView работает точно так же:

Теперь посмотрим на компонент suspense:

Получаем ссылку на каждую из ранее созданных директив. Мы также получаем ссылку на ViewContainerRef, чтобы мы могли добавить компонент в представление.

Следующие шаги заключаются в следующем: Создайте представление fallback, выберите компонент, создайте его и дождитесь, пока метод setup() завершит свою работу. Затем очистите представление и визуализируйте компонент. В случае ошибки вместо этого визуализируйте представление error.

И это все. Давайте посмотрим, как это работает:

Я также пошел дальше и добавил поддержку неленивых компонентов:

В приведенном выше примере он будет ждать, пока оба компонента закончат свои setup(), а затем отрендерить оба.

Вы можете увидеть полный код в репозитории this. Я знаю, что, вероятно, кое-что упустил, помните, что это была быстрая и грязная работа 🤓

🔥 Присоединяйтесь к нам

Вы суперзвезда Angular со страстью к ОС? Участвуйте в проектах ngneat и давайте создавать инструменты сегодня и завтра!

🚀 На случай, если вы это пропустили

Вот несколько моих проектов с открытым исходным кодом:

  • Акита: государственное управление, специально разработанное для JS-приложений
  • Spectator: мощный инструмент для упрощения ваших угловых тестов
  • Transloco: библиотека интернационализации Angular
  • error-tailer - Бесшовные формы ошибок для приложений Angular
  • Менеджер форм: основа правильного управления формами в Angular
  • Кешью: гибкая и простая библиотека, которая кэширует HTTP-запросы.
  • Error Tailor - бесшовные формы ошибок для приложений Angular.

И еще многие!

Подпишитесь на меня в Medium или Twitter, чтобы узнать больше об Angular, Akita и JS!