美文网首页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