BehaviorSubject被多次执行

时间:2018-07-18 13:22:07

标签: angular behaviorsubject

我正在为我的应用程序使用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

这是我称之为行为主题的唯一地方,但是我发现我的行为主题发出了不止一次

问题在于,尽管loadStudentsByClass仅被调用一次,但behaviorSubject却多次执行this.globals.loadStudentsByClass.next(this.selectedClass);

通过执行次数取决于我在应用程序中访问的视图数

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这将调用两次,因为每当behaviourSubject更改时,它将发出最新的值。以前它是您为它提供的null(作为默认值),下一个当服务响应到来时,您要执行下一步,因此它将在更改后发出最新值,这很公平。对于您的代码,您只应检查

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

答案 2 :(得分:0)

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

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