BehaviorSubject 被执行了不止一次

BehaviorSubject is executed more than once

我正在为我的应用程序使用 angular 4,我使用 behaviorSubject 在组件之间进行通信,一切正常

这是我的代码:

export class Globals {
loadStudentsByClass: BehaviorSubject<string> = new BehaviorSubject<string>(null);
}

export class ClassComponent implements OnInit {
selectNewClass() {
    console.log('About to select new class', this.selectedClass);
    this.globals.loadStudentsByClass.next(this.selectedClass); 
    this.globals.changeClassBehavior.next(true);
    this.router.navigateByUrl('');
  }
}

export class StudentComponent implements OnInit {
    this.globals.loadStudentsByClass.subscribe(value => {
          if (!isNullOrUndefined(value) && this.selectedClass !== value) {
            console.log('loadStudentsByClass=> home');
            this.loadStudentsByClass(this.selectedClass);
          }
        });
}

所以,我有组件 ClassComponent 触发 StudentComponent 调用函数 loadStudentsByClass

这是我唯一调用此行为主题的地方,但我发现我的行为主题不止一次发出

问题是为什么 behaviorSubject 执行 loadStudentsByClass 不止一次,尽管 this.globals.loadStudentsByClass.next(this.selectedClass); 只被调用了一次

顺便说一句,执行次数取决于我在应用程序中访问的视图数

这将调用两次,因为每当 behaviorSubject 发生变化时,它都会发出最新的值。以前它是你给它的 null(作为默认值),接下来当服务响应到来时你正在做下一步,所以它会在更改后发出最新值,这很公平。对于您的代码,您应该只检查

if(value){// do the stuff here}

尝试一个没有初始值但仍会缓存您的流的重播主题:

export class Globals {
loadStudentsByClass = new ReplaySubject<string>(1);
}

当组件被销毁时,您可能忘记在 StudentComponent 中取消订阅。将订阅保存在 class 变量和 ngOnDestroy() 生命周期钩子调用 subscription.unsubscribe()