Angular - Почему ngOnInit вызывается каждый раз, когда я выдаю новое значение? - PullRequest
0 голосов
/ 29 февраля 2020

В моем сервисе есть субъект с именем refreshSubject $ .

  private refreshUsers$ = new Subject<User[]>();

Он выдает новое значение при каждом добавлении пользователя.

  saveUser(user: User[]) {
    return this.http.post<User>(this.url, user)
      .pipe(
        tap(() => {
          this.refreshUsers$.next();
        })
      );
  }

Я использую метод get в своем сервисе для получения значения

  get refresh$() {
    return this.refreshUsers$;
  }

Теперь каждый раз, когда я добавляю нового пользователя, я генерирую новое значение, используя метод next () .

  this.refreshUsers$.next();

Внутри моего компонента у меня есть хук жизненного цикла ngOnInit, который вызывается каждый раз, когда субъект refreshUsers $ выдает новое значение.

  ngOnInit(): void {
    this.apiService.refresh$.subscribe(() => {
      this.getAllUsers();
    });
  }

Почему ngOnInit вызывается каждый раз, когда я подписываюсь на новое значение?

Ответы [ 3 ]

3 голосов
/ 29 февраля 2020

В onInit вы подписаны на свою тему, поэтому каждый раз, когда вы отправляете новое значение, будет запущен метод "this.getAllUsers ()". Не имеет значения, подписаны ли вы в OnInit. Подписка жива, пока вы не отмените подписку.

2 голосов
/ 29 февраля 2020

Подписка будет срабатывать при каждом отправлении события, не имеет значения, где оно находится. Таким образом, ваш ngOnIt не получает триггер каждый раз, когда событие инициируется, но оно «подписывается», но поскольку ваша подписка находится внутри «ngOnInIt», это будет выглядеть так, как будто «ngOnInIt» запускается. Если вы не хотите этого, вы можете отменить подписку за пределами ngOnInIt, хотя это не создаст проблемы. Потому что другие логи c, которые вы написали внутри ngOnInIt, не сработают.

Если вы хотите проверить себя, вы можете добавить console.log ("testing") внутри вашего ngOnInit, но вне подписки. И отправив несколько событий, мы заметим, что «тестирование» будет зарегистрировано только один раз (при загрузке компонента)

1 голос
/ 29 февраля 2020

Это не ... обратный вызов подписки вызывается каждый раз, когда вы отправляете значение, т. Е. Эта часть:

() => {
      this.getAllUsers();
}

Но вы не делаете новую подписку каждый раз, когда вы отправляете значение.

Вот как работают наблюдаемые

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