我一直在以角度阅读注射器。经过大量阅读后,我知道在编译阶段模块会合并,并且可以在根注入器中使用。但是作为模块一部分的组件将获得一个单独的进样器。为什么它有一个单独的进样器
@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”,因为在编译时合并了非延迟加载的模块。但是,为什么行为在组件级别上有所不同。谢谢!
答案 0 :(得分:0)
但是作为模块一部分的一个组件需要一个单独的进样器。 为什么它有一个单独的进样器
如果您没有在@Components装饰器中指定provider键,则不会,它不会拥有自己的注入器
它将获得根注入器提供的内容。 另外,需要明确的是,如果我的模块不提供该服务,即使它是延迟加载的模块,它也会获得根注入器将提供的内容。
如果它提供相同的服务,则 1.如果模块是延迟加载的,那么它将拥有自己的服务实例(因为它将拥有自己的子注入器)(Angula更喜欢孩子而不是父代)。 2.如果急切地加载了模块,那么在两个模块之间也不会出现错误->将使用相同的实例。