Использование этого в конструкторе с привязкой зависимостей в угловых - PullRequest
0 голосов
/ 23 ноября 2018

Я проверял документы Angular Official и другие блоги и видел 2 разных типа синтаксиса для DI при использовании в конструкторе, иногда они используют this, а иногда не используют this.какой из них правильный?

Я знаю, что нам нужно использовать this в любом другом методе класса, но почему мы не используем this в конструкторе.или просто private и public идентификатор имеют значение для использования this

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


class NameService {
  getName () {
    return "Angular";
  }
}

@Component({
  selector: 'my-app',
  template: '<h1>Favourite framework: {{ name }}</h1>'
})
class AppComponent {
  name: string;

  constructor(nameService: NameService) {
    this.name = nameService.getName(); // do not use this

  }

  otherMethod() {
    this.nameService.getName(); // use this
  }
}

где-то, где я видел людей, использующих это в конструкторе.здесь один из пример

constructor(@Optional() private logger: Logger) {
  if (this.logger) {
    this.logger.log(some_message); // using this
  }
}

так когда мы используем это, а когда нет?или мы используем это в следующем примере из-за @Optional декораторов?

1 Ответ

0 голосов
/ 23 ноября 2018

Это все о Typescript.Когда вы используете public, private или protected для параметров конструктора следующим образом

constructor(private logger: Logger) {}

На самом деле Typescript создает поле с тем же именем и устанавливает его для вас.Таким образом, вместо написания следующего кода вы можете просто написать код выше

private logger: Logger;

constructor(logger: Logger) {
    this.logger = logger;
}

Поскольку вы уже написали private logger, вы можете просто использовать свое поле с this.Неважно, как вы используете его в конструкторе.

Есть Typescript Playground , где вы можете попробовать это и увидеть это сами.Все, что вы напечатаете в левом поле, будет преобразовано в обычный JS (ES5) в правом поле.

@Optional декоратор просто сообщает Angular, что все в порядке, если он не может найти этот объект для инъекции.

Правило большого пальца:

Если вы используете private, protected или public для любого поля и хотите его использовать, всегда используйте this (в пределахконструктор)

Если вы не пометили поле ни одним из указанных выше ключевых слов, вы не можете использовать this и не можете получить доступ к этому объекту вне конструктора.

Если вам нужен доступ ксвойство / метод класса, вы ДОЛЖНЫ использовать this.

...