Angular 2中Component装饰器和NgModule装饰器的提供者之间的区别

时间:2017-02-17 14:37:33

标签: angular

提供者组件装饰器数组

@Component({
    moduleId: module.id,
    selector:    'hero-list',
    templateUrl: './hero-list.component.html',
    providers:  [ HeroService ]
 })
 export class HeroListComponent implements OnInit {
    /* . . . */
 }

提供者NgModule装饰器数组

@NgModule({
  imports:      [ BrowserModule ],
  providers:    [ Logger ],
  declarations: [ AppComponent ],
  exports:      [ AppComponent ],
  bootstrap:    [ AppComponent ]
})

Angular2中这两个提供程序数组有什么区别?

1 个答案:

答案 0 :(得分:7)

区别在于提供者可用的范围以及将创建的实例数。

每个提供商的实例

如果将它添加到组件中,该组件的每个实例都将拥有它自己的服务实例,而对于非延迟加载的模块,整个应用程序只有一个实例。 / p>

<强>范围

如果将其添加到组件中,则只应用组件和指令,并且此组件的后代将能够注入实例。

分层注入和提供者查找

当组件注入服务时,DI会通过检查组件提供程序,然后检查其父级以及其他祖先来查找它,直到找到匹配的提供程序。如果在到达根组件(AppComponent)时找不到它,则会查看应用程序根范围(@NgModule())。

延迟加载模块

延迟加载的模块有自己的&#34; root&#34;范围。这是因为一旦初始化并且最初没有懒惰模块,就不能修改注入器的提供者。 因此,延迟加载的模块的提供者不会在全局中可用,仅在延迟加载的模块的范围内。 为了解决这个限制,引入了forRoot()(主要是约定而不是某些特性)来在根目录中注册提供程序,同时保持导入模块的其余部分是惰性的。