Typescript зависимая инъекция public vs private
В чем разница между инъекцией службы с public и private. Я вижу, что большинство примеров используют закрытое ключевое слово в компоненте angular. Имеются ли какие-либо последствия для использования общественности?
например.
constructor(public carService: CarService) { }
против.
constructor(private carService: CarService) { }
Ответы
Ответ 1
В дополнение к предыдущему ответу... все, что помечено как личное, также невозможно получить с помощью шаблона компонента. (Доступ к частным членам можно получить при использовании JIT, например, во время разработки, но не при использовании AOT, например, для производства.)
Итак, в вашем шаблоне вы можете сделать только *ngIf='carService.isValid'
если введенная услуга была отмечена как public
.
Но на самом деле лучше всего обернуть все свойства/методы службы в свойстве/методе компонента в любом случае и привязать шаблон к/вызвать свойство или метод компонента.
Что-то вроде этого:
get isValid(): boolean {
return this.carService.isValid;
}
И затем войдите в него так: *ngIf='isValid'
Ответ 2
Ответ довольно прост: вы должны создавать частные переменные, когда вам не нужно использовать их вне текущего класса/компонента, в противном случае вы должны создать публичные переменные. И еще одна вещь: вы также можете использовать закрытые переменные и предоставлять им доступ извне через специальные функции, называемые getters и setters. Например:
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
и get
перед именами методов не очень нужны, они больше для пояснения.
Ответ 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>