Angular 2:在bootstrap之前调用服务

时间:2017-03-29 14:07:13

标签: angular

当引导我的Angular 2(v2.4)时,我试图运行一个在应用程序加载之前自动授权用户的函数。但是,这似乎不起作用。

import {platformBrowserDynamic} from "@angular/platform-browser-dynamic";
import {enableProdMode, APP_INITIALIZER} from "@angular/core";
import {Http, HttpModule} from "@angular/http";
import {PARAMETERS} from "../config/parameters";
import {AppModule} from "./AppModule";
import {UserRepository} from "../modules/service/repository/UserRepository";
import {SessionManager} from "../modules/service/manager/SessionManager";


export function auth(userRepository: UserRepository) {
    console.log("BOOM!");
    return () => userRepository.autoAuthorize();
};

platformBrowserDynamic().bootstrapModule(AppModule, [
    {
        provide: APP_INITIALIZER,
        useFactory: auth,
        deps: [UserRepository, SessionManager, HttpModule],
        multi: true
    }
])
    .catch(err => console.error(err));

我做错了什么,我怎么能让它发挥作用?另外,如果我有上述代码,是否需要将这些服务添加到AppModule中的providers数组中?

非常感谢

JT

1 个答案:

答案 0 :(得分:1)

将其所依赖的服务添加到您已有的提供商列表中。

...
platformBrowserDynamic().bootstrapModule(AppModule, {
     providers: [ UserRepository, SessionManager, HttpModule,
    {
        provide: APP_INITIALIZER,
        useFactory: auth,
        deps: [UserRepository, SessionManager, HttpModule],
        multi: true
    }
]});
...

https://github.com/angular/angular/blob/4.0.0/packages/core/src/linker/compiler.ts#L90-L109

对于编译器选项,您提供了一个包含提供程序的对象。现在应该编译它,了解你想要用于工厂的类。

作为注释,您也可以在其提供程序列表中的appmodule中执行此操作,而不是在引导程序编译器选项上执行此操作