代码之家  ›  专栏  ›  技术社区  ›  POV

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

  •  0
  • POV  · 技术社区  · 6 年前

    我用角2。我用单人服务 @NgModule({}) 在部分提供程序中: ['MenuService'] 我用 MenuService .

    菜单用户设备 看起来是: @可注射()

    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 回复  |  直到 6 年前
        1
  •  0
  •   Joachim Cardoen    6 年前

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

        2
  •  1
  •   Amit Chigadani    6 年前

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

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

    相当于做

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

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

    有帮助的时候 MenuService 构造函数需要一些参数,但您不确定要发送什么。

        3
  •  -1
  •   Anuradha Gunasekara    6 年前

    有两种方法可以使服务成为角度单一的服务:

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

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

    从角度6.0开始,创建单例的首选方法 服务是在服务上指定它应该在 应用程序根目录。这是通过设置 providedIn 根除 服务 @Injectable 装饰工

    import { Injectable } from '@angular/core';
    
    @Injectable({
      providedIn: 'root',
    })
    export class UserService {
    }
    

    取自 Angular official documentation .