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>