美文网首页Angular框架专题
Angular中的Multi Providers

Angular中的Multi Providers

作者: 听书先生 | 来源:发表于2021-12-14 00:09 被阅读0次
1、前言

Multi providers是可以使用同一个Token去注册多个不同的Providers。
multi: true表明这个provider是一个multi provider。当使用multi provider时,我们可以在DI中为单个Token令牌提供多个值。它们都有相同的Token,但它们能注册不同的provide。如果我们用Token去请求依赖项时,我们得到的是所有已注册的依赖对象列表。

const SOME_TOKEN: OpaqueToken = new OpaqueToken('SomeToken');

var injector = Injector.create([
  { provide: SOME_TOKEN, useValue: 'dependency one', multi: true },
  { provide: SOME_TOKEN, useValue: 'dependency two', multi: true }
]);

var dependencies = injector.get(SOME_TOKEN);
// dependencies == ['dependency one', 'dependency two']

如果使用同一个Token注册provider时,不加multi:true属性时,就会导致之后注册的provider会覆盖前面已经注册的provider,此外,multi provider这种机制提供了可插拔的钩子,且multi provider不能与普通的provider混合使用。

2、NG_VALIDATORS实现表单自定义检验器

定义一个validator

export interface ValidatorFn {
  (c: AbstractControl): ValidationErrors | null;
}

当验证信息不通过的时候,会返回一个键值对,赋给formControl errors

export declare type ValidationErrors = {
  [key: string]: any;
};

为指令指定供应商NG_VALIDATORS

import { Directive} from '@angular/core';
import { NG_VALIDATORS, Validator, AbstractControl} from '@angular/forms';

@Directive({
  selector: '[appConfirmpsw]',
  providers: [{
    provide : NG_VALIDATORS,
    useExisting : ConfirmpswDirective,
    multi: true
  }]
})
export class ConfirmpswDirective implements Validator {

  constructor() {

   }
  validate(control: AbstractControl): {[key: string]: any} {
     //检验规则
  }
}

这个Token用来去配置一些自定义的校验器Provider

3、APP_INITIALIZER

APP_INITIALIZER是一个函数,在应用改程序初始化时被调用。可以在AppModule类的providers中以factory的形式来配置。适合加载简单的数据或简单的校验。

export function loadFactory(loadService: LoadService): Function {
  return () => loadService.load();
}

@NgModule({
  providers: [
    {
      provide: APP_INITIALIZER,
      useFactory: loadFactory,
      deps: [LoadService, Injector],
      multi: true
    }
  ]
})

该Token用于配置系统的初始化相关工作。

相关文章

网友评论

    本文标题:Angular中的Multi Providers

    本文链接:https://www.haomeiwen.com/subject/dvzsfrtx.html