Angular InjectionToken APP_INITIALIZER 的实现方法介绍

简介: Angular InjectionToken APP_INITIALIZER 的实现方法介绍

APP_INITIALIZER 是 InjectionToken的一个实例。它是 Angular 提供的内建注入令牌。


Angular会在应用加载时执行这个令牌提供的函数。如果函数返回promise,那么angular会一直等待,直到promise被解析。这将使它成为在应用程序初始化之前执行一些初始化逻辑的理想位置。


Angular 注入器使用 DI 令牌来定位 Angular providers 中的依赖项。我们使用令牌在提供者中注册依赖项:

providers :[{ provide: token, useClass: SomeService }]

上面代码里的 token,可以是一个 type,一个字符串,或者是 InjectionToken 的一个实例。

  • type 的例子:
providers :[{ provide: productService, useClass: productService}]
  • 字符串的例子:
providers :[ {provide:'MESSAGE', useValue: 'Hello Angular'}]

当所使用的类型没有运行时表示时,例如注入接口、可调用类型(callable type) 等,就会使用 InjectionToken - TypeScript 代码里的 interface,被编成 JavaScript 之后,后者从编程语言层面不存在 interface 这种 representation. 此时可以使用 InjectionToken.

export const HELLO_MESSAGE = new InjectionToken<string>('Hello Angular'); 
providers :[ { provide: HELLO_MESSAGE, useValue: 'Hello World!' }];

如前所述,APP_INITIALIZER在应用程序初始化时运行。Angular会暂停应用的初始化,直到APP_INITIALIZER提供的所有函数运行完毕。如果其中任何一个初始化器返回一个promise,那么angular就会等待它的解析,然后再继续进行App的初始化。

这使我们有机会连接到初始化进程并运行一些应用程序自定义逻辑。可以加载运行时配置信息。从后台加载重要数据等。

看一个例子。新建文件 app-init.service.ts

import { Injectable }  from '@angular/core';
@Injectable()
export class AppInitService {
    constructor() {
    }
    Init() {
        return new Promise<void>((resolve, reject) => {
            console.log("AppInitService.init() called");
            do your initialisation stuff here  
            setTimeout(() => {
                console.log('AppInitService Finished');
                resolve();
            }, 6000);
        });
    }
}

app.module.ts 的实现:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule, APP_INITIALIZER } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { AboutUsComponent } from './about-us.component';
import { HomeComponent } from './home.component';
import { ContactUsComponent } from './contact-us.component';
import { AppInitService } from './app-init.service';
export function initializeApp1(appInitService: AppInitService) {
  return (): Promise<any> => { 
    return appInitService.Init();
  }
}
@NgModule({
  declarations: [
    AppComponent, AboutUsComponent,HomeComponent,ContactUsComponent
  ],
  imports: [
    HttpClientModule,
    BrowserModule,
    AppRoutingModule,
  ],
  providers: [ 
    AppInitService,
    { provide: APP_INITIALIZER,useFactory: initializeApp1, deps: [AppInitService], multi: true}
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

上面的代码,使用了 InjectionToken APP_INITIALIZER 来提供函数 initializeApp1,后者调用了我们 service class 的 init 方法。


Angular的依赖注入会把依赖注入到类和组件中,但不会注入到函数中。而我们的initializeApp1是一个函数,需要将AppInitService作为参数注入。因此我们通过使用 deps 标志来做到这一点,并让 Angular 知道它需要创建一个AppInitService的实例,并将它注入到initializeApp1函数中。


multi: true 创建 multi provider DI 令牌。这意味着可以为DI令牌提供提供程序数组。


如果 multi: false(默认值)被设置并且多次使用一个令牌,最后注册的将令牌将覆盖之前所有的令牌。也就是说,令牌只能有一个 provider.


相关文章
|
2月前
|
开发者 iOS开发
处理开发者账号到期导致 APP 下架的方处理开发者账号到期导致 APP 下架的方法
处理开发者账号到期导致 APP 下架的方处理开发者账号到期导致 APP 下架的方法
|
2月前
|
开发框架 前端开发 Android开发
专刊:随着技术进步,未来在线生成App将有更多可能性,为移动应用开发带来便利
【4月更文挑战第27天】在数字化时代,移动App变得不可或缺,而在线生成App的技术正逐渐兴起,为开发者提供快捷创建移动应用的途径。本文探讨了网页到App的转变过程,介绍了WebView嵌入、混合式开发框架和云端打包技术等方法,以及在线生成App的步骤、优势和挑战。虽然存在性能和功能限制,但随着技术进步,未来在线生成App将有更多可能性,为移动应用开发带来便利。
|
17天前
|
Ubuntu Android开发
蓝易云 - Ubuntu上导出APP的base.apk方法说明
注意:在实际的生产环境中,你应该使用 `assembleRelease`任务来构建一个用于发布的Release版本的APK,并且你需要提前配置好签名信息。
107 58
|
2月前
|
Android开发 iOS开发 开发者
App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
App备案-iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹的获取方法
226 0
|
2月前
|
开发者
Angular UntypedFormControl markAsDirty 方法的用途介绍
Angular UntypedFormControl markAsDirty 方法的用途介绍
|
2月前
|
Android开发
Android APP 隐藏系统软键盘的方法
Android APP 隐藏系统软键盘的方法
62 0
|
2月前
|
前端开发
【专栏】在 create-react-app 中集成 less/sass 预处理器和 react-css-modules 的方法
【4月更文挑战第29天】本文介绍了在 create-react-app 中集成 less/sass 预处理器和 react-css-modules 的方法。首先,通过 `npm` 安装 less 或 sass 依赖,然后修改 `config-overrides.js` 配置文件以支持 less/sass 编译。接着,详细阐述如何使用 less/sass 编写样式。再者,安装 react-css-modules 并配置 webpack,使能样式模块化。最后,展示了如何结合使用 less/sass 和 react-css-modules,以提升前端开发的效率和代码质量。
|
2月前
|
前端开发
Angular module 的 forRoot 和 forChild 方法
Angular module 的 forRoot 和 forChild 方法
|
2月前
|
存储 安全 开发工具
APP安全加固怎么做?加固技术、加固方法、加固方案
APP安全加固怎么做?加固技术、加固方法、加固方案
37 3
|
2月前
|
开发框架 编解码 移动开发
从网页到应用:探索在线生成App的方法
本文介绍了如何在线生成App,将网页封装成App的技术方法和步骤。通过使用特定的工具和框架,开发者可以将现有的网页转化为功能完善的移动应用程序,提供更好的用户体验和便捷的访问方式。
34 0