Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.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
Angular 为什么每次注入服务后都要调用构造函数?_Angular_Angular6 - Fatal编程技术网

Angular 为什么每次注入服务后都要调用构造函数?

Angular 为什么每次注入服务后都要调用构造函数?,angular,angular6,Angular,Angular6,我使用角度2。我在providers部分使用单例服务@NgModule({}):['MenuService']我使用MenuService MenuService看起来像: @可注射() 我将此服务注入两个组件: export class HeaderComponent { constructor(private menuService: MenuService) {} } export class HomeComponent { constructor(private menuSer

我使用角度2。我在providers部分使用单例服务
@NgModule({})
['MenuService']
我使用
MenuService

MenuService看起来像: @可注射()

我将此服务注入两个组件:

export class HeaderComponent {
  constructor(private menuService: MenuService) {}
}

export class HomeComponent {
  constructor(private menuService: MenuService) {}
}

我看到
console.log('Called')两次,为什么要重复调用它?

服务在注入组件时总是运行其构造函数,它必须设置服务的字段/道具。所以这一行为一点也不奇怪。注入的接口“充当”2个对象

有两种方法可以使服务成为Angular中的单例服务:

  • 声明应在应用程序根目录中提供服务

  • 将服务包括在AppModule或仅由AppModule导入的模块中

从Angular 6.0开始,创建单例的首选方法 服务是在服务上指定应在中提供的服务 应用程序根目录。这是通过将
providedIn
设置为root on来实现的 服务的
@Injectable
装饰器

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class UserService {
}

取自。

是,注入的服务
构造函数在初始化时立即被组件调用

export class HomeComponent {
  constructor(private menuService: MenuService) {}
}
这相当于做某事

private menuService: MenuService;
export class HomeComponent {
  constructor() {
      this.menuService = new MenuService(params...);
  }
}
因此,基本上,
DI
消除了如第二种方法所示显式创建对象的需要


DI
MenuService
构造函数需要一些参数而您不确定要发送什么时非常有用。

这两个组件和服务是否在同一个模块中?您是否在多个位置提供了服务?是,在同一个模块中确定了两个组件:
Core.module
在声明部分:
声明:[HomeComponent,HeaderComponent]
是的,我在两个组件中提供了它,我在上面说过了。你确定吗?很明显,在使用它之前,必须先有一个服务实例,因此,它必须被实例化(将被调用aka构造函数)如果它是一个单例,为什么要调用两次?Angular 2呢?如果要做:
@Injectable({providedIn:'root',})
是的,你不能在Angular 2中使用
@Injectable({providedIn:'root'})
。只有在angular 6.0之后,你才能使用这个。但是OP说它是单体的?
private menuService: MenuService;
export class HomeComponent {
  constructor() {
      this.menuService = new MenuService(params...);
  }
}