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