Angular 2在模块被BootStrapped之前制作并处理Ajax请求配置

时间:2016-12-19 00:55:22

标签: angular bootstrapping

我正在使用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。

我已经尝试过我正在尝试做的事情,我错过了什么?

1 个答案:

答案 0 :(得分:1)

根据我的个人经验,我无法让APP_INITIALIZER以我需要的方式工作。我找不到任何适合我的例子。所以我只是试着在第二次尝试时尝试做什么。但是,您需要扩展CookieXSRFStrategy并覆盖configureRequest。这是NoopCookieXSRFStrategy来自的地方。

class NoopCookieXSRFStrategy extends CookieXSRFStrategy {
  configureRequest(request) {
    // noop
  }
}

请参阅complete example