使用public和private注入服务有什么区别。我看到大多数示例在angular组件中使用private关键字。使用公众会有什么影响吗? e.g。
constructor(public carService: CarService) { }
VS
constructor(private carService: CarService) { }
答案 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>