Многократное присвоение переменной в угловых - PullRequest
0 голосов
/ 26 октября 2019

Мне нужно разъяснить назначение переменных в службе Angular,

Я новичок в Angular, и я хочу иметь глубокое понимание последствий присвоения переменной в этих трех местах, как показано ниже. .

Дело 1

    import { Injectable, OnInit } from "@angular/core";

    @Injectable({
      providedIn: 'root'
    })
    export class FavoriteMovieService implements OnInit {

      sampleArray;    

      constructor() {
        this.sampleArray = [1, 2, 3, 4, 5];
      }

      ngOnInit() { }
    }

Дело 2

    import { Injectable, OnInit } from "@angular/core";

    @Injectable({
      providedIn: 'root'
    })
    export class FavoriteMovieService implements OnInit {

      sampleArray;    

      constructor() {}

      ngOnInit() {
        this.sampleArray = [1, 2, 3, 4, 5];
      }
    }

Дело 3

    import { Injectable, OnInit } from "@angular/core";

    @Injectable({
      providedIn: 'root'
    })
    export class FavoriteMovieService implements OnInit {

      sampleArray = [1, 2, 3, 4, 5];;    

      constructor() {}

      ngOnInit() {}
    }

Информация о версии

  Angular CLI: 8.3.5
Node: 10.15.3
OS: win32 x64
Angular: 8.2.7

1 Ответ

1 голос
/ 26 октября 2019

Перед добавлением различий, обратите внимание, что ngOnInit не будет работать вообще в вашем случае. Он не будет вызван.

Единственный хук жизненного цикла, который будет работать со службами, - это ngOnDestroy, который будет вызываться при разрушении службы. Все другие хуки жизненного цикла, такие как ngOnInit, не будут вызываться, поскольку они будут вызываться только для компонентов и директив.

Я добавлю различия и включу ngOnInit, если вместо этого он реализован внутри компонента / директивы.

Для различий между присваиваниями конструктора и прямыми прямыми присваиваниями, начиная с здесь :

Оба являются правильными в программировании,

Инициализируется в конструкторе

Это было бы хорошей практикойинициализация внутри конструктора, это своего рода разделение кода объявления + инициализации.

Это повысит читабельность вашего кода, и вы будете уверены, что все значения инициализируются только внутри конструктора. и потому что в конструкторе это когда объект создается, и это когда переменная должна быть инициализирована.


Инициализировано вне конструктора

Одна проблема с инициализацией с использованием конструктора - больше кода для записи, когда у вас есть переменная alot для работы, в этом случае вы должны использовать прямую counter: number = 1. В этом случае вы можете проверить объявление + инициализацию в одной строке, нов приведенном выше случае вы должны пройти через 2 шага: объявление + инициализация

Это действительно важно, когда вы выбираете инициализацию в одном из ловушек жизненного цикла (например, 1039 * / NgAfterViewInit) противconstructor. Либо это просто стиль кодирования

Для конструктора и хука ngOnInit, начиная с здесь :

Constructor является значением по умолчаниюметод класса, который выполняется, когда создается экземпляр класса, и обеспечивает правильную инициализацию полей в классе и его подклассах. Angular или лучше Dependency Injector (DI) анализирует параметры конструктора и, когда он создает новый экземпляр, вызывая new MyClass(), он пытается найти поставщиков, которые соответствуют типам параметров конструктора, разрешает их и передает их конструктору, как

new MyClass(someArg);

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

Нам нужно импортировать OnInit, чтобы использовать его так (фактически реализуя OnInit не является обязательным, но считается хорошей практикой):

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

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

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

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

Реализуйте этот интерфейс для выполнения пользовательской логики инициализации после инициализации связанных с данными свойств вашей директивы. ngOnInit вызывается сразу после того, как привязанные к данным свойства директивы были проверены впервые, и до того, как был проверен любой из его дочерних элементов. Он вызывается только один раз, когда создается директива.

В основном мы используем ngOnInit для всей инициализации / объявления и избегаем вещей, которые будут работать в конструкторе. Конструктор должен использоваться только для инициализации членов класса, но не должен выполнять фактическую «работу».

Поэтому вы должны использовать constructor() для настройки Dependency Injection и ничего больше. ngOnInit () - лучшее место для «запуска» - именно здесь / когда разрешаются привязки компонентов.

Для получения дополнительной информации см. здесь:

...