Конструктор компонентов Angular 2 против OnInit

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

Во что я должен поместить функцию x? Конструктор компонентов или OnInit?


person ClickThisNick    schedule 07.03.2016    source источник


Ответы (3)


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

чтобы использовать ngOnInit, мы должны импортировать этот хук из основной библиотеки:

import {Component, OnInit} from '@angular/core'

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

Пример использования обоих:

export class App implements OnInit{
  constructor(){
     //called first time before the ngOnInit()
  }

  ngOnInit(){
     //called after the constructor and called  after the first ngOnChanges() 
  }
}

Подробнее см. также Разница между конструктором и ngOnInit

person Pardeep Jain    schedule 07.03.2016
comment
Но вы не ответили на собственно вопрос. какой из них мы должны использовать в этом случае ..? - person Jugal Singh; 31.08.2017
comment
ngOnInit не вызывается сразу после вызова конструктора, между ними есть ngOnChanges: angular.io/guide/lifecycle -крючки - person Hazlo8; 21.09.2017
comment
@JugalSingh Вы должны использовать ngOnInit для работы, связанной с привязкой. Использование конструктора не рекомендуется, так как это влияет на производительность. Если нет острой необходимости инициализировать что-то заранее, onInit очень хорошо подходит для этих целей. - person mobby; 03.08.2018
comment
Такое ощущение, что веб-формы ада снова и снова. Я просто хотел знать, что конструктор был вызван до ngInit в жизненном цикле ‹strike›webforms‹/strike› - person Piotr Kula; 06.08.2018

Первый (конструктор) связан с созданием экземпляра класса и не имеет ничего общего с Angular2. Я имею в виду, что конструктор можно использовать в любом классе. Вы можете поместить в него некоторую обработку инициализации для вновь созданного экземпляра.

Второй соответствует хуку жизненного цикла компонентов Angular2:

  • ngOnChanges вызывается при изменении входного или выходного значения привязки
  • ngOnInit вызывается после первого ngOnChanges

Таким образом, вы должны использовать ngOnInit, если обработка инициализации вашей функции зависит от привязок компонента (например, параметры компонента, определенные с помощью @Input), в противном случае конструктора было бы достаточно...

person Thierry Templier    schedule 07.03.2016
comment
Есть ли ситуации, когда использование ngOnInit вместо конструктора было бы плохим? - person dman; 29.12.2017

constructor() — это функция машинописного текста, которая вызывается для new SomeClass(). Конструктор обеспечивает правильный порядок инициализации полей в иерархии классов.

ngOnInit — это метод жизненного цикла Angular2, который вызывается Angular после завершения сборки компонента и после первой оценки привязок и обновления входных данных.

См. также Разницу между конструктором и ngOnInit

person Günter Zöchbauer    schedule 07.03.2016
comment
Вы правы на 100%, голосую за вас. На мой взгляд, если мы описываем ngOnInit как componentDidMount React, вся путаница исчезнет. Но, если честно, для разработчиков нам достаточно иметь только одну фразу инициализации, как бы она ни называлась. Очень старым способом является использование функции, такой как класс, для создания класса компонента, поэтому инъекция передается в качестве аргументов, и вам нужен только один $onInit. Ng2+ — это не произведение искусства. - person stanleyxu2005; 04.02.2018
comment
Конструктор — это функция языка TypeScript с некоторыми ограничениями. Angular ничего не может с этим поделать. - person Günter Zöchbauer; 04.02.2018