我正在使用Angular 2.3。
我想发一个ajax请求将数据加载到我的配置服务中,并且只有在收到并处理了ajax响应后才允许将配置服务注入其他组件和服务。
到目前为止,我已尝试过两种技术,但两种技术都没有起作用:
首先,我在app模块中使用了这种技术:
providers: [
Config2Service,
{
provide: APP_INITIALIZER,
deps: [ Config2Service ],
multi: true,
useFactory: (configService: Config2Service) => {
return () => configService.initialize();
}
}
]
在此示例中,initialize()返回一个promise,工厂在返回该函数之前将其包装在函数中。这是唯一有效的组合。以下不起作用:(1)返回config.initialize本身。 (2)返回调用configservice.initialize()的结果。
不要误解我的意思,早期调用configService的initialize函数,但是返回的promise不会被等待;当组件尝试访问配置服务中的配置数据时,app bootstraps会失败。稍后,配置数据会出现并正确处理,但到那时为时已晚,应用程序已崩溃。
在第二种情况下,我删除了上述内容,并试图这样做:
let providers = [
{
provide: Http, useFactory: (backend: XHRBackend, options: RequestOptions) => {
return new Http(backend, options);
},
deps: [XHRBackend, RequestOptions]
},
BrowserXhr,
ConfigService,
XHRBackend,
{ provide: RequestOptions, useClass: BaseRequestOptions },
{ provide: ResponseOptions, useClass: BaseResponseOptions },
{ provide: XSRFStrategy, useValue: new CookieXSRFStrategy() }
];
let configService: ConfigService = ReflectiveInjector.resolveAndCreate(providers).get(ConfigService);
configService.initialize()
.then(configData => {
platformBrowserDynamic().bootstrapModule(MyAccountModule.factory(configService));
});
上述内容因此错误而失败: 未处理的Promise拒绝:无法在CookieXSRFStrategy.configureRequest中读取null的属性'getCookie'
在我得到的SO示例中,具体的XSRFStrategy被称为NoopCookieXSRFStrategy,但我在@ angular / http文件夹中找不到它。我也不能找到发布此代码的HTTP_PROVIDERS。
我已经尝试过我正在尝试做的事情,我错过了什么?
答案 0 :(得分:1)
根据我的个人经验,我无法让APP_INITIALIZER
以我需要的方式工作。我找不到任何适合我的例子。所以我只是试着在第二次尝试时尝试做什么。但是,您需要扩展CookieXSRFStrategy
并覆盖configureRequest
。这是NoopCookieXSRFStrategy
来自的地方。
class NoopCookieXSRFStrategy extends CookieXSRFStrategy {
configureRequest(request) {
// noop
}
}