在Angular中注入参数化依赖项和手动引导

在Angular中注入参数化依赖项和手动引导,angular,Angular,在引导angular应用程序之前,我需要执行一个异步操作,为应用程序返回一些上下文。在开始之前,我需要用这些返回的数据初始化一些第三方存储库,然后我想将这个存储库注入到我的应用程序的服务中。我正在寻找一种合适的、干净的方法,因为我现在拥有的方法对我来说有点粗糙 app.module.ts内容: let repo; //this is what i'd like to avoid @NgModule({ declarations: [ AppComponent ]

在引导angular应用程序之前,我需要执行一个异步操作,为应用程序返回一些上下文。在开始之前,我需要用这些返回的数据初始化一些第三方存储库,然后我想将这个存储库注入到我的应用程序的服务中。我正在寻找一种合适的、干净的方法,因为我现在拥有的方法对我来说有点粗糙

app.module.ts
内容:

let repo; //this is what i'd like to avoid

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        ReactiveFormsModule
    ],
    providers: [
        {
            provide: SomeService, useFactory: () => new SomeService(repo)
        }
    ],
    entryComponents: [AppComponent]
})
export class AppModule implements DoBootstrap {
    ngDoBootstrap(app: ApplicationRef) {

        //some async operation which returns context data
        setTimeout((data) => {
            repo = Some3rdPartyDatabaseSDK.init(data.token, data.repoConfig)
            app.bootstrap(AppComponent);
        }, 3000);
    }
}

可以做得更好吗?

对于这种情况,您应该使用APP\u INITIALIZER,在初始化angular APP时调用此函数

Angular将在应用程序初始化时执行提供的功能。我将等待 如果函数返回一个承诺,则初始化,直到该承诺得到解决

  • 在项目中创建
    AppLoadService
  • 在服务中创建初始化方法。(此方法应返回承诺)
  • 创建将引用模块中的init方法的函数
  • 提供程序中设置
    APP\u初始值设定项
  • (应用程序将在5s后初始化)

    应用加载.service.ts

    @Injectable()
    导出类AppLoadService{
    回购:任何;
    init():承诺{
    返回新承诺((解决、拒绝)=>{
    log('应用程序尚未初始化');
    设置超时(()=>{
    log('App initialized');
    this.repo='某些值';
    解决();
    }, 5000);
    });
    }
    }
    
    应用程序模块.ts

    从'@angular/core'导入{NgModule,APP_初始值设定项};
    函数init_app(appLoadService:appLoadService){
    return()=>appLoadService.init();
    }
    @NGD模块({
    供应商:[
    AppLoadService,
    {提供:APP_初始值设定项,useFactory:init_APP,deps:[AppLoadService],multi:true}
    ]
    })
    导出类AppModule{}
    
    您正在寻找
    APP\u初始值设定项
    是在开发时需要的还是在生产中(构建后)也需要它?@Plochie in prod.Angular应用程序将在iframe中运行,父框架将通过posMessage@akn您需要
    APP\u初始值设定项
    然后按照@yurzui的建议。@Plochie,没有。我得先了解一下。仍然欢迎举例回答:)