为什么组件有一个单独的进样器,而不是急于加载的模块?

时间:2019-06-21 09:05:36

标签: angular dependency-injection

我一直在以角度阅读注射器。经过大量阅读后,我知道在编译阶段模块会合并,并且可以在根注入器中使用。但是作为模块一部分的组件将获得一个单独的进样器。为什么它有一个单独的进样器

@Component({
selector: 'app-parent',
templateUrl: './parent.component.html',
styleUrls: ['./parent.component.css'],
providers:[{ provide: APP_CONFIG, useValue:"From Component" }],
})
export class ParentComponent implements OnInit {
constructor(@Inject(APP_CONFIG) app_config: string) {
    //here app_config will be from component
}
}


@NgModule({
    declarations:[
        ParentComponent
    ]
providers:[{ provide: APP_CONFIG, useValue:"fromModule" }]
})
class AModule(){
    constructor(@Inject(APP_CONFIG) app_config: string){
        //Here the value will be "from root"
    }
}

@NgModule({
imports:[AModule],
providers:[{ provide: APP_CONFIG, useValue:"fromRoot"  }]
})
class AppModule(){ }

我理解为什么AModule中的注入值是“ fromroot”,因为在编译时合并了非延迟加载的模块。但是,为什么行为在组件级别上有所不同。谢谢!

1 个答案:

答案 0 :(得分:0)

  

但是作为模块一部分的一个组件需要一个单独的进样器。   为什么它有一个单独的进样器

如果您没有在@Components装饰器中指定provider键,则不会,它不会拥有自己的注入器

它将获得根注入器提供的内容。 另外,需要明确的是,如果我的模块不提供该服务,即使它是延迟加载的模块,它也会获得根注入器将提供的内容。

如果它提供相同的服务,则  1.如果模块是延迟加载的,那么它将拥有自己的服务实例(因为它将拥有自己的子注入器)(Angula更喜欢孩子而不是父代)。  2.如果急切地加载了模块,那么在两个模块之间也不会出现错误->将使用相同的实例。