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