angular学习小结

373 阅读1分钟

angular 依赖注入是angular的核心思想

StaticProvider 和 Injector 通过Injector.create将StaticProvider转化为Injector

create(options: {providers: StaticProvider[], parent?: Injector, name?: string}): Injector

PlatformRef是什么?

平台实例描述,createPlatform和createPlatformFactory工厂创建生成,也可以理解成提供特定依赖注入项目的集合

  • createPlatform

通过传入Injector创建PlatformRef

createPlatform(injector: Injector): PlatformRef
  • createPlatformFactory

通过StaticProvider创建PlatformRef,内部调用createPlatform创建PlatformRef

createPlatformFactory(
  parentPlatformFactory: ((extraProviders?: StaticProvider[]) => PlatformRef) | null,
  name: string, 
  providers: StaticProvider[] = []
): (extraProviders?: StaticProvider[]) => PlatformRef

PlatformRef启动后生成NgModuleRef

export class PlatformRef {
    // 通过NgModuleFactory启动,aot
    bootstrapModuleFactory<M>(
    moduleFactory: NgModuleFactory<M>,
    options?: BootstrapOptions
  ): Promise<NgModuleRef<M>>;
  // 通过NgModule启动,jit
  bootstrapModule<M>(
    moduleType: Type<M>,
    compilerOptions: (CompilerOptions & BootstrapOptions) |
      Array<CompilerOptions & BootstrapOptions> = []
  ): Promise<NgModuleRef<M>>
}

NgModuleRef

ngModule实例,可以由NgModuleFactory.create生成,可以理解为局部/模块内依赖注入项目集合,NgModule的存在一定程度上解决Injector的配置使用问题。直接引用其他NgModule就能拿到此NgModule所注册的Injector。

ComponentFactoryResolver

组件工厂提供者,由NgModuleRef注入,ComponentFactoryResolver.resolveComponentFactory生成ComponentFactory

ComponentFactory

组件工厂,ComponentFactory.create创建ComponentRef

create(
      injector: Injector, 
      projectableNodes?: any[][], 
      rootSelectorOrNode?: string|any,
      ngModule?: NgModuleRef<any>
): ComponentRef<C>;
  • ComponentFactory_:ComponentFactory的实现

ComponentRef

组件实例描述,ComponentRef.hostView获取ViewRef,ComponentRef.changeDetectorRef获取ChangeDetectorRef

  • ComponentRef_: ComponentRef的实现

ViewRef 和 ChangeDetectorRef

ViewRef:视图实例描述, ChangeDetectorRef:变化检测实例描述,用于控制变化检测