Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于angular2提供者的一些问题_Angular_Angular2 Services - Fatal编程技术网

关于angular2提供者的一些问题

关于angular2提供者的一些问题,angular,angular2-services,Angular,Angular2 Services,对不起,我是编程新手,没有一个朋友知道这个话题,所以我会被我愚蠢的问题淹没 我可以在引导级别设置提供程序 bootstrap(AppComponent, [Service]); 根组件中的 @Component({ providers: [Service], //... 或在子组件级别 本次提问: 我会简化,但如果someService集是someComponent的提供者,这是否意味着someComponent具有someService的字段和方法? 提供者是否为组件提供服

对不起,我是编程新手,没有一个朋友知道这个话题,所以我会被我愚蠢的问题淹没

我可以在引导级别设置提供程序

bootstrap(AppComponent, [Service]);
根组件中的

@Component({
    providers: [Service],
    //...
或在子组件级别

本次提问:

  • 我会简化,但如果someService集是someComponent的提供者,这是否意味着someComponent具有someService的字段和方法? 提供者是否为组件提供服务的方法和字段以实例化新实例
  • 删除
  • 如果我提供服务,它的方法可以在较低的级别被调用
  • 如果someComponent注入了someService,其中注入了someService2,我是否需要在someComponent级别将它们两个[someService,someService2]都设置为提供者?如果我已经在上层组件中注入了someservice2somewere或/和
  • 为什么HTTP_提供程序设置在引导级别
  • 您应该阅读dev指南。它将回答你的大部分问题

    当一个组件有一个
    providers:[MyService]
    行时,这意味着该组件和所有子组件将共享同一个/单个服务实例

    如果一个服务需要注入另一个服务,它将查找组件树以找到所需服务的提供者,并使用它首先找到的提供者

    HTTP_提供者通常在引导中设置,因为我们通常只需要这些类/服务的一个实例

    3.

    依赖注入是分层的

    bootstrap()
    |-app-component
      |-sub-component1
      |-sub-component2
        |-sub-sub-component21
    
    当Angulars DI实例化组件或服务时,它会检查构造函数期望的参数,并尝试查找匹配的提供程序

    当创建了
    子组件
    并且它有一个类似
    构造函数(myService:myService)
    的构造函数时,DI开始从
    子组件
    提供者向上查看是否找到了匹配的提供者。如果它到达'bootstrap(),但仍然没有找到,它将失败并显示错误消息

    对于层次结构中的每个级别,只创建一个提供程序实例。 当
    MyService
    bootstrap()
    中注册为提供者时,任何请求
    MyService
    的组件都将在
    bootstrap()中创建的相同实例中被传递

    MyService
    也在
    sub-component2
    中注册时,当
    sub-sub-component
    请求
    MyService
    时,它将从
    sub-component2
    中获取该服务,因为这是它找到的第一个。当
    子组件1
    也请求
    MyService
    时,DI将返回
    bootstrap()
    中的一个,因为向上的层次结构没有提供任何其他
    MyService

    如果要与整个应用程序共享某些数据,请仅在
    bootstrap()
    上注册要用于共享数据的服务

    1.

    如果组件(“子组件”)具有类似

    export class SubComponent {
      constructor(private myService: MyService) {
      }
    
      someName: string;
    
      clickHandler($event) {
        this.myService.clickHappended = true;
        this.someName = this.myService.loadNameFromServer();
      }
    }
    
    然后,对
    MyService
    的引用被分配给
    MyService
    ,而
    子组件中的代码可以读写
    MyService
    s字段并调用其方法

    4.如果someComponent注入了someService,其中注入了someService2,我是否需要在someComponent级别将它们两个[someService,someService2]都设置为提供者?如果我已经在上层组件中注入了someservice2somewere或/和

    当Angular创建组件类或服务类时,它使用DI。它查找请求类型的提供程序,并创建实例或使用现有实例。当DI创建实例时,它会检查该类型的构造函数,并再次查找这些类型的提供程序。这在任意级别递归进行(即使在DI需要一些帮助的循环中也是如此)

    所以,简短的回答是:是的。DI注入的所有内容都需要注册的提供者

    5.为什么HTTP\U提供程序设置为引导级

    HTTP_提供者提供的类可以被整个应用程序重用。不需要为每个HTTP请求创建新实例,也不需要每个组件或服务都有自己的
    HTTP
    类实例。如果希望特定组件使用不同的
    Http
    类,可以将该特定
    Http
    类添加到该组件的提供者列表中。此组件及其所有子组件将改用此提供程序

    export class MySpecialHttp {
    }
    
    @Component(selector: 'sub-sub',
       providers: [provide(Http, {useClass: MySpecialHttp})]
    export class SubSubComponent {
      constructor(http: Http) {}
    }
    
    这里我们指示DI,当
    子组件
    或它的子组件之一请求
    Http
    时,将
    MySpecialHttp
    传递给DI