Angular 5.x将包括新的in this tweet代码,如ojit_a所述。我有两个问题:

  • 与现有的ReflectiveInjector有何不同?
  • 它会破坏我现有的任何代码吗?
  • 最佳答案

    首先,有一篇很棒的文章Angular introduces StaticInjector. Should you care?解释了细节上的差异。



    反射式喷油器

    依靠Reflect库提供的反射功能来提取提供程序的隐式依赖关系,因此命名为Reflective:

    class B {}
    class A {
      constructor(@Inject(B) b) { } <----- `B` is implicit dependency
    }
    
    const i = ReflectiveInjector.resolveAndCreate([A, B]);
    
    @Inject装饰器定义用于指定隐式依赖关系的元数据,并且ReflectiveInjector使用此元数据。

    静电喷油器

    不使用反射功能,需要明确指定依赖项:
    class B {}
    class A { constructor(b) {} }
    const i = Injector.create([{provide: A, useClass: A, deps: [B]]};
    const a = i.get(A);
    


    class B1 {}
    class A1 { constructor(@Inject(B1) b) {} }
    
    class B2 {}
    class A2 { constructor(@Inject(B2) b) {} }
    bootstrapModule(AppModule, {providers: [A1, B1]}).platformBrowserDynamic([A2, B2])
    

    您现在应该将其更改为:
    class B1 {}
    class A1 { constructor(b) {} }
    
    class B2 {}
    class A2 { constructor(b) {} }
    
    platformBrowserDynamic([{ provide: A1, useClass: A1, deps: [B1] }, B1])
    .bootstrapModule(AppModule, { providers: [ {provide: A2, useClass: A2, deps: [B2]}, B2 ] })
    
    ReflectiveInjector仍被标记为稳定,因此您可以继续使用它。但是很有可能在将来将其删除。我建议您在可用后立即开始使用StaticInjector

    09-17 14:15