Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在ngOnInit上调用ReplaySubject?_Javascript_Angular_Typescript_Observable_Angular9 - Fatal编程技术网

Javascript 为什么在ngOnInit上调用ReplaySubject?

Javascript 为什么在ngOnInit上调用ReplaySubject?,javascript,angular,typescript,observable,angular9,Javascript,Angular,Typescript,Observable,Angular9,我试图在两个组件之间进行交互,即头部组件和路由器出口组件,其中包含反应形式。几天前,在做了大量研究之后,我得到了一个答案,它告诉我使用共享服务,并且有一个ReplaySubject变量。这将充当可观察的,它将在路由器出口中组件的ngOnInit中调用。所以问题就出现了。一切正常,但刚才测试时注意到一个小错误。单击页眉中的按钮后,事件将在主组件中触发,但它将保持活动状态,直到我硬重新加载页面。 下面是我的代码: shared.service.ts public updateSrc = new Re

我试图在两个组件之间进行交互,即头部组件和路由器出口组件,其中包含反应形式。几天前,在做了大量研究之后,我得到了一个答案,它告诉我使用共享服务,并且有一个
ReplaySubject
变量。这将充当
可观察的
,它将在
路由器出口
中组件的
ngOnInit
中调用。所以问题就出现了。一切正常,但刚才测试时注意到一个小错误。单击页眉中的按钮后,事件将在主组件中触发,但它将保持活动状态,直到我硬重新加载页面。 下面是我的代码:

shared.service.ts

public updateSrc = new ReplaySubject<any>(1);
public updateClick = this.updateSrc.asObservable();
main.component.ts(这里的主要操作发生在单击标题按钮时)

updateClicked=newsubject();
恩戈尼尼特(){
this.dataService.updateClick.pipe(takeUntil(this.updateClick)).subscribe({
下一步:value=>console.log(value);//在第一次单击按钮时,这种情况会完全发生,但是如果来自不同的路径&之前单击了标题按钮,则会触发这种情况
});
}
恩贡德斯特罗(){
this.updateClicked.next();//在此处关闭订阅
}

有人能给我建议如何重置吗?

ReplaySubject(以及
Behavior Subject
)存储以前发出的值,并在添加新订户时发出这些值

如果您不希望新订户接收以前发出的值,则始终可以使用不存储发出的值的
Subject


您可能需要阅读更多关于中可用变量的信息。

ReplaySubject存储“当前”值。这意味着它会向新订户发送“旧”值。有没有办法破坏它?我正在关闭订阅,但它仍然是相同的属性。请确保您必须在
updateClicked
主题上调用
complete()
,另外添加
next()
以触发
takeUntil
是的,我在那之后尝试了此操作,谢谢您的帮助
update() {
  return this.dataService.updateSrc.next(true);
}
updateClicked = new Subject<any>();

ngOnInit() {
  this.dataService.updateClick.pipe(takeUntil(this.updateClicked)).subscribe({
    next: value => console.log(value); // At first click of button this happening perfectly but if coming from different route & had clicked the header button previously this thing is getting triggered
  });
}

ngOnDestroy() {
  this.updateClicked.next(); // Closing subscription here
}