Когда именно запускается APP_INITIALIZER?

У меня есть имя среды, встроенное в компонент приложения, например:

<app-component env = "dev" />

Мне нужно получить некоторую конфигурацию из серверной части на основе этого атрибута app-component. Эта конфигурация должна быть создана до того, как произойдет любой другой вызов бэкэнда (поскольку все они используют эту конфигурацию).

Что/когда лучше всего с этим справиться?

Является ли APP_INITIALIZER правильным способом сделать это? Или APP_INITIALIZER происходит еще до того, как я могу получить доступ к атрибуту app-component?

Другой вариант, который я могу рассмотреть, — это просто глобальная переменная js/ts внутри index.html. Третий вариант — решатель/защитник на маршруте /.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя функцию JS getElementsByTagName, вы сможете получить элемент и значение его атрибута. После этого вы можете приступить к выполнению желаемых вызовов BE.

export function appInit(/*params*/): () => any {
  const appComponent = document.getElementsByTagName('app-component').item(0);
  const env = appComponent?.getAttribute('env');
  console.info('Env:', env);
  return () => { /* do stuff */  };
}

Но я бы рекомендовал использовать переменную environment, которую можно установить для различных сред, заменить скриптом сборки и легко получить. Просто import там, где нужно. Затем вы можете использовать его либо в APP_INITIALIZER, либо в любом другом месте кода, см..

Как мне гарантировать, что appInit разрешится и получит значения перед любым другим вызовом в приложении? APP_INITIALIZER гарантирует это?

tlzg 26.06.2024 06:56
APP_INITIALIZER устроен таким образом. Когда функция init возвращает Promise или Observable, приложение ожидает ее выполнения и только затем приступает к начальной загрузке приложения. Если в app-component (или любой другой точке входа) есть какой-то код, он не выполнится до завершения инициализации.
mat.hudak 26.06.2024 07:03

как APP_INIZIALIZER связан с компонентами onInit? причина вопроса: мне нужно прочитать этот атрибут env в основном компоненте перед запуском APP_INITIALIZER.

tlzg 26.06.2024 07:08

Если под основным компонентом вы подразумеваете что-то еще, кроме точки входа приложения (обычно app-component), то вы не сможете получить к нему доступ в APP_INITIALIZER, поскольку само приложение еще не загрузилось. И это не связано с onInit, это происходит задолго до того, как будет сделан любой onInit звонок.

mat.hudak 26.06.2024 07:15

да, извини, я имел в виду app-component. теперь, когда я думаю об этом, с SSR это не сработает. Кажется, лучше использовать глобальную переменную, определенную в index.html, и прочитать ее в APP_INITIALIZER. Вы бы согласились?

tlzg 26.06.2024 07:22

Определенно, мы поступаем так же. Даже в архитектуре микроинтерфейса мы можем проверить, является ли автономное приложение общедоступным, и либо создать экземпляр MSAL, либо нет. И это происходит из переменных среды.

mat.hudak 26.06.2024 08:31

как вы вписались в это местное развитие? что вы используете локально для замены текста привязки в main.ts? Я хотел бы избежать извлечения и пользовательских настроек webpack/vite. есть идеи?

tlzg 26.06.2024 18:01

Давайте продолжим обсуждение в чате.

mat.hudak 27.06.2024 10:22

Другие вопросы по теме