- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 APP_INITIALIZER 从 json 获取配置,它工作正常。
早些时候我有一个身份验证作为应用程序的一部分,它曾经工作得很好。
然后我们将授权逻辑拆分到一个库中,如果我们调用 forRoot() 或者如果我们为 config 提供静态值但允许动态配置,我使用库中的 InjectionToken 来提供配置而不调用 forRoot,它可以正常工作。
的代码app.module.ts 是这样的:
let authConfig: any;
export function authConfigFactory() {
return authConfig;
}
export function appInitializerFn(appConfigService: AppConfigService) {
return () => {
return appConfigService.loadAppConfig().then(() => {
authConfig = {
clientId: appConfigService.getConfig().CLIENT_ID,
tokenEndpoint: appConfigService.getConfig().TOKEN_URL,
redirectURL: "http://localhost",
};
});
};
};
@NgModule({
.....
imports: [
..
AuthLib
],
providers: [
AppConfigService,
{
provide: APP_INITIALIZER,
useFactory: appInitializerFn,
multi: true,
deps: [AppConfigService]
},
AuthLibService,
{
provide: 'authConfig',
useFactory: authConfigFactory,
deps: []
},
.....
]
bootstrap: [AppComponent]
})
export class AppModule { }
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { environment } from 'src/environments/environment';
import { AppConfig } from '../_models/app-config';
import { LoggingService } from './logging.service';
@Injectable()
export class AppConfigService {
static appConfig : AppConfig;
private dataLoc: string;
constructor(private http: HttpClient,
private logger: LoggingService) { }
loadAppConfig() {
if(environment.production){
this.dataLoc = '/assets/data/appConfig.json';
}
else{
this.dataLoc = '/assets/data/appConfig-dev.json';
}
return new Promise<void>((resolve, reject) => {
this.http.get(this.dataLoc).toPromise().then((response: AppConfig) => {
AppConfigService.appConfig = <AppConfig>response;
resolve();
}).catch((response: any) => {
reject(`Could not load file '${this.dataLoc}':
${JSON.stringify(response)}`);
});
});
}
getConfig() {
return AppConfigService.appConfig;
}
}
最佳答案
于是找到了原因和解决办法。为任何人发布它都会绊倒这个问题。
由于 APP_INITIALIZER 被正确调用。我错过的事情是我正在使用“HttpClient”来获取配置,而该配置又会调用 ROOT 中定义的任何 HTTP_INTERCEPTORS 并最终导致身份验证服务的初始化,而身份验证服务又需要身份验证配置作为构造函数中的 token 注入(inject)。
因此, token 甚至在获取值之前就被注入(inject),导致它变为未定义/空。
解决方案虽然很简单,但我们可以使用
import { Injectable } from '@angular/core';
import { HttpClient, HttpBackend } from '@angular/common/http';
import { environment } from 'src/environments/environment';
import { AppConfig } from '../_models/app-config';
import { LoggingService } from './logging.service';
@Injectable()
export class AppConfigService {
static appConfig : AppConfig;
private dataLoc: string;
constructor(private handler: HttpBackend,
private logger: LoggingService) { }
loadAppConfig() {
if(environment.production){
this.dataLoc = '/assets/data/appConfig.json';
}
else{
this.dataLoc = '/assets/data/appConfig-dev.json';
}
return new HttpClient(this.handler).get(this.dataLoc)
.toPromise()
.then((data:AppConfig) => {
this.logger.info(data);
AppConfigService.appConfig = data;
});
}
getConfig() {
return AppConfigService.appConfig;
}
}
关于angular - APP_INITIALIZER 和依赖 token 解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56928730/
我有一个简单的配置服务,我在我的 app.shared.module.ts 中使用 APP_INITIALIZER token 连接: ConfigService, {
我正在尝试使用 auth0/auth0-angular Angular 11 应用程序中的库。 我正在关注 loading config dynamically 上的部分. 它提供了这个示例应用模块代
我有一个延迟加载的模块,我正在尝试添加 APP_INITIALIZER 但它没有触发。我的语法与我的主应用程序完全相同,它按预期工作。延迟加载的模块是否会触发 APP_INITIALIZER? 最佳答
我正在使用 APP_INITIALIZER Hook 从本地 json 文件加载一些应用配置。加载配置后,我想在另一个提供程序中使用它(为我生成的 swagger-codegen 服务设置 BASE_
我有一个 Angular (v6.0.0) 应用程序,我正试图通过在 APP_INITIALIZER 期间引入运行时配置来设置它。我已经阅读了几篇文章(例如 this 和 this 和 this )以
我正在使用 APP_INITIALIZER 加载环境特定变量。我需要在我的 authConfigFactory 中使用这些变量,但工厂会在 APP_INITIALIZER 完成应用程序配置之前继续加载
我正在使用这个 gist在应用程序启动期间读取配置文件。这工作正常,但在进行单元测试时出现错误 Cannot read property 'SomeProperty' of null。 我也添加了pr
我正在使用 this 中推荐的 APP_INITIALIZER回答,我的服务返回一个 promise ,但它并不总是等待它解决,我可以看到我的组件 console.logging 未定义,然后服务记录
我有一个 Angular 5.2.0 应用程序。我查找了如何实现 APP_INITIALIZER在应用程序启动之前加载配置信息。这里是 app.module 的摘录: providers: [
typescript :2.2.0 Angular :4.0 我试图通过使用 APP_INITIALIZER 确保在应用程序启动之前初始化 ConfigService 对象。我发现了很多关于如何执行此
在我的 Angular 6 应用程序中,我通过这样的 Http 服务加载我的外部化配置: export function getSettings(appLoadService: ConfigLoadS
问题是:我需要进行 http 调用并存储生成动态路由所需的对象。所以,我正在利用 APP_INITIALIZER。 // app.module.ts import { ApplicationServi
我在使用 Angular APP_INITIALIZER 加载配置文件时遇到问题。 它似乎服务开始加载 APP_INTIALIZER,因此配置文件无法到达服务, 并且在配置文件需要在服务启动之前进行设
如何在 Angular 应用程序执行 app_initializer 代码时显示等待指示器。 截至目前,我可以在加载应用程序之前显示等待指示器。但是在该页面保持空白直到 app_initializer
背景:我需要在应用程序启动期间执行几次初步检查(1)从./assets/config.json文件读取angular应用程序配置并从那里获取API端点,(2)进行API调用到端点在第一步中检索并从后端
类似于Angular 5 APP_INITIALIZER gives Cyclic dependency error 我有一个使用 Angular 5 和 SSR 的应用程序,我刚刚从 Angular
我有一个来自静态 AppConfigService 的配置文件的值。 说明如下: 引用代码/文章:https://blogs.msdn.microsoft.com/premier_developer/
我在使用 Angular 4 时遇到了一些引导问题。我有一个配置文件 (json),我在应用程序启动时从服务器加载它(另请参见 here )。这到目前为止有效。 现在我有一个 dependency这需
我正在寻找能让我在某个模块初始化时执行代码的东西。这个模块在我的应用程序中是延迟加载的。 APP_INITIALIZER 仅适用于应用程序初始化过程(一次从引导的主模块开始)。 我不能使用延迟加载模块
我正在尝试一个简单的 APP_INITIALIZER使用我的 angular 应用程序,但出现错误 this.appInits[i] is not a function - 无法弄清楚问题。 这是我的
我是一名优秀的程序员,十分优秀!