打字稿依赖注入public vs private

时间:2017-10-05 23:57:03

标签: angular typescript

使用public和private注入服务有什么区别。我看到大多数示例在angular组件中使用private关键字。使用公众会有什么影响吗? e.g。

constructor(public carService: CarService) { }

VS

constructor(private carService: CarService) { }

3 个答案:

答案 0 :(得分:27)

除了先前的答案之外......组件的模板也无法访问标记为私有的任何内容。 (使用JIT时可以访问私有成员 ,例如在开发时,但在使用AOT时不能访问,例如用于生产。)

因此,在您的模板中,您只能执行*ngIf='carService.isValid' 如果注入的服务标记为public

但实际上,最佳做法是将任何服务属性/方法包装在组件属性/方法中,并让模板绑定到/调用组件的属性或方法。

这样的事情:

   get isValid(): boolean {
      return this.carService.isValid;
   }

然后像这样访问:*ngIf='isValid'

答案 1 :(得分:4)

答案很简单:当你不需要在当前类/组件之外使用它们时,你必须创建私有变量,否则,你应该创建公共变量。还有一件事:您还可以使用私有变量,并通过名为 getters setters 的特殊函数从外部访问它们。例如:

file_put_contents("/tmp/test_file.txt", "text string");

请注意,private _customValue: any; set customValue(newValue: any): void { this._customValue = newValue; } get customValue(): any { return this._customValue; } 是私有的,但您可以通过_customValue的操作在课堂外设置/获取此值:

customValue

需要说明的是,在强烈需要方法名称之前的classInstance.customValue = 'newValue'; console.log(classInstance.customValue); set个关键字,更多是为了澄清。

答案 2 :(得分:3)

例如,在您拥有服务的情况下:

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

@Injectable({
  providedIn: 'root'
})

export class CarService {

  constructor() { }

  public design = {
    "color": "blue"
  }
}

在您要构造服务的构造函数中

constructor(private carService: CarService) { }

您可以使用常规方法退回服务

 getCarService() {
      return this.carService;
 }

您可以在模板中执行

<div>{{getCarService().design.color}}</div>