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

时间:2018-07-18 07:18:05

标签: angular angular6

我使用Angular2。我在节提供程序中使用单例服务@NgModule({})['MenuService']我使用MenuService

MenuService 如下: @Injectable()

export class MenuService {

  constructor(private userService: UserService, private i18nService: I18nService) { console.log('Called'); }
}

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

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

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

我见过console.log('Called');两次了,为什么又叫它?

3 个答案:

答案 0 :(得分:1)

是的,注入服务constructors在初始化时立即被组件调用。

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

等同于

private menuService: MenuService;
export class HomeComponent {
  constructor() {
      this.menuService = new MenuService(params...);
  }
}

因此,基本上,DI消除了如第二种方法所示显式创建对象的需要。

DI构造函数需要一些参数并且您不确定要发送什么时,

MenuService会很有帮助。

答案 1 :(得分:0)

服务在注入组件时将始终运行其构造函数,它必须设置服务的字段/属性。因此,这根本不是怪异的行为。注入的接口“充当”两个对象。

答案 2 :(得分:-1)

  

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

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

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

  •   
     

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

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

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

摘自Angular official documentation