Angular 6: использование модификатора доступа при внедрении любого сервиса

Проходя обучение, я сталкиваюсь со странным сценарием.

при внедрении службы в свой компонент, если вы пропустите модификатор доступа, он выдаст вам ошибку, как указано ниже, но добавление его как частного или общедоступного будет работать нормально.

Разве у нас нет области действия по умолчанию в Angular, если мы пропустим модификатор доступа?

export class UserDetailsComponent implements OnInit {

  name = "";
  lastName = "";
  constructor(userService : UserServiceService) { }

  ngOnInit() {
  }

  save(){
    this.userService.saveUser();

  }

}

Property 'userService' does not exist on type 'UserDetailsComponent'.

stackoverflow.com/a/58654247/5043867
Pardeep Jain 01.11.2019 05:55
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
6
1
4 615
4

Ответы 4

Typescript предоставляет вам ярлык для общего шаблона для внедрения зависимостей.

Вы можете поместить это в свой конструктор:

  this.userService = userService

А также создайте объявление свойства:

  userService: UserService;

Или вы можете просто указать «public» в параметре функции ctor, и Typescript сделает все это за вас. То же самое и с «частным». Но AOT может потерпеть неудачу, если попытаться использовать частное свойство в вашем шаблоне.

Больше информации

Если вы префикс параметра конструктора с помощью модификатора доступа (private, protected или public) или readonly, он автоматически становится «повышенным» как свойство класса в TypeScript. Эта конструкция называется свойства параметра конструктора.

Без префикса параметр конструктора является не чем иным, как параметром метода, и вам придется вручную назначить его объявленному свойству класса из самого конструктора.

Из справочник:

Parameter properties are declared by prefixing a constructor parameter with an accessibility modifier or readonly, or both. Using private for a parameter property declares and initializes a private member; likewise, the same is done for public, protected, and readonly.

Проблема возникает, когда вы не предоставляете спецификатор доступа для параметров конструктора, он не будет зарегистрирован на уровне класса. Вместо этого область действия переменной параметра ограничена функцией конструктора. Чтобы сделать ее доступной для всего класса, мы даем модификаторы доступа

С твоим примером

export class UserDetailsComponent implements OnInit {
  name = "";
  lastName = "";
  constructor(userService : UserServiceService) {
    console.info(userService)
  }
  ngOnInit() {
  }
  save(){
    this.userService.saveUser();
  }
}

userService доступен только внутри конструктора Если вы поместите console.info(userService) внутрь конструктора, вы можете получить некоторый вывод консоли.

Если вы не хотите указывать какие-либо модификаторы доступа или хотите назначить другую переменную класса, вы можете указать, как показано ниже

export class UserDetailsComponent implements OnInit {
  name = "";
  lastName = "";
  private _service
  constructor(userService : UserServiceService) { 
    this._service = userService;
  }
  ngOnInit() {
  }
  save(){
    this._service.saveUser();
  }
}

В приведенном выше коде я назначил введенный userService другому члену класса _service.

Вообще нет причин переименовывать. Вы можете просто сделать this.userService = userService, чтобы назначить параметр конструктора свойству с тем же именем.

Robby Cornelissen 31.10.2018 04:53

Все уже предоставленные ответы очень ясны и содержат полезную информацию. Проще говоря, вот что происходит:

Ваш конструктор - это функция. На любом языке программирования (с которым я сталкивался до сих пор) параметры функции существуют только в рамках самой функции. Таким образом, параметр, передаваемый в конструктор, недоступен во всем классе, если его значение явно не присвоено члену класса (как показано во втором фрагменте кода, предоставленном Самуэлем Дж. Мэтью.

Модификаторы доступа в параметре инструктируют Angular создать член класса с тем же именем, что и параметр, с предоставленным модификатором доступа и инициализировать его экземпляром типа параметра. Другими словами, параметр становится членом / свойством класса. Как уже было сказано, это называется свойством параметра, и это очень подходящее название для него.

Документация, предоставленная Кеном, очень полезна. Определенно стоит прочитать.

Другие вопросы по теме