角度-为什么每次发出新值时都会调用ngOnInit?

时间:2020-02-29 11:03:47

标签: angular typescript rxjs angular2-observables subject-observer

我的服务中有一个名为 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 个答案:

答案 0 :(得分:3)

在onInit中,您已订阅主题,因此每次发出新值时,都会运行方法“ this.getAllUsers()”。您是否已订阅OnInit都没有关系。订阅一直有效,直到您取消订阅为止。

答案 1 :(得分:2)

无论事件位于何处,每次发出事件时,订阅都会触发。 因此,每次触发事件时,您的ngOnIt 不会被触发,但是它是“订阅”的,但是由于您的订阅在“ ngOnInIt”内部,因此它看起来像是在触发“ ngOnInIt”。 如果您不希望这样做,可以将您的订阅移出ngOnInIt外部,尽管这不会造成问题。因为您在ngOnInIt内部编写的其他逻辑不会被触发。

如果要检查自己,可以在ngOnInit内但在订阅外部添加console.log(“ testing”)。并发出多个事件,我们将注意到“测试”仅记录一次(组件加载时)

答案 2 :(得分:1)

不是...每次发出值(即此部分)时,都会调用订阅回调:

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

但是,每次发出值时,您并不需要进行新的订阅。

可观察性就是这样