Angular中的视图提供者是什么?黑白提供者与视图提供者有什么区别?


79

以下代码中的viewProviders是什么?它与提供者有何不同?

class Greeter {
   greet(name:string) {
     return 'Hello ' + name + '!';
   }
}    
@Component({
  selector: 'greet',
  viewProviders: [
    Greeter
  ],
  template: `<needs-greeter></needs-greeter>`    
})
class HelloWorld {
}

Answers:


108

在您的示例中,provider和viewProviders之间没有区别,因为HelloWorld的模板不使用<ng-content>。如果您要在中投射内容<ng-content>...</ng-content>,则无法使用Greeter,因为您正在使用

viewProviders: [Greeter] 

如果您希望将Greeter潜在地注入到投影内容中,则可以使用

providers: [Greeter]

因此,viewProviders将提供者限制为非计划内容的子对象,同时providers允许所有子对象使用提供者。该值viewProviders使您可以防止投影的内容与您的服务混乱,这在库中特别有用。


2
尽管我没有完全理解,但还是提出了批评。仅仅因为它“听起来”正确。
回调

4
我发现这个视频是有帮助的:youtube.com/...
传单

好答案!用“为什么”推理弄皱。
Bhargav Shah

1
要理解此答案,首先我们应该了解view child和content(projected)child有什么区别;
Mithun Kumar

最后三行说明得很好。
哈桑·拉扎

4
  1. 如果我们想在整个应用程序中共享一个服务实例,则可以在NgModule的提供程序中对其进行配置。
  2. 如果我们希望每个组件具有一个服务实例,并与所有组件的子组件共享,则可以在组件装饰器的providers属性上对其进行配置。孩子是一个观点的孩子。
  3. 如果我们希望每个组件具有一个服务实例,并且仅与组件的视图子级而不与组件的内容子级共享,则可以在组件装饰器的viewProviders属性上对其进行配置。

完全同意。
哈桑·拉扎
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.