У меня есть имя среды, встроенное в компонент приложения, например:
<app-component env = "dev" />
Мне нужно получить некоторую конфигурацию из серверной части на основе этого атрибута app-component.
Эта конфигурация должна быть создана до того, как произойдет любой другой вызов бэкэнда (поскольку все они используют эту конфигурацию).
Что/когда лучше всего с этим справиться?
Является ли APP_INITIALIZER правильным способом сделать это? Или APP_INITIALIZER происходит еще до того, как я могу получить доступ к атрибуту app-component?
Другой вариант, который я могу рассмотреть, — это просто глобальная переменная js/ts внутри index.html.
Третий вариант — решатель/защитник на маршруте /.





Используя функцию 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, либо в любом другом месте кода, см..
APP_INITIALIZER устроен таким образом. Когда функция init возвращает Promise или Observable, приложение ожидает ее выполнения и только затем приступает к начальной загрузке приложения. Если в app-component (или любой другой точке входа) есть какой-то код, он не выполнится до завершения инициализации.
как APP_INIZIALIZER связан с компонентами onInit? причина вопроса: мне нужно прочитать этот атрибут env в основном компоненте перед запуском APP_INITIALIZER.
Если под основным компонентом вы подразумеваете что-то еще, кроме точки входа приложения (обычно app-component), то вы не сможете получить к нему доступ в APP_INITIALIZER, поскольку само приложение еще не загрузилось. И это не связано с onInit, это происходит задолго до того, как будет сделан любой onInit звонок.
да, извини, я имел в виду app-component. теперь, когда я думаю об этом, с SSR это не сработает. Кажется, лучше использовать глобальную переменную, определенную в index.html, и прочитать ее в APP_INITIALIZER. Вы бы согласились?
Определенно, мы поступаем так же. Даже в архитектуре микроинтерфейса мы можем проверить, является ли автономное приложение общедоступным, и либо создать экземпляр MSAL, либо нет. И это происходит из переменных среды.
как вы вписались в это местное развитие? что вы используете локально для замены текста привязки в main.ts? Я хотел бы избежать извлечения и пользовательских настроек webpack/vite. есть идеи?
Давайте продолжим обсуждение в чате.
Как мне гарантировать, что
appInitразрешится и получит значения перед любым другим вызовом в приложении?APP_INITIALIZERгарантирует это?