Angular 如何将@Output取消订阅为可观察
我有一个关于取消订阅Angular中的Angular 如何将@Output取消订阅为可观察,angular,rxjs,rxjs5,Angular,Rxjs,Rxjs5,我有一个关于取消订阅Angular中的Outputs的问题。我知道EventEmitter会自动清理,但上次我需要使用可观察的作为我的输出。我的意思是,我想要获取输出,它每秒最多发出一次事件。所以我的代码看起来像: @Output() loadNextEvent: Observable<any>; loadNextSubject = new Subject(); constructor(private el: ElementRef) { this.loadNextEvent
Output
s的问题。我知道EventEmitter会自动清理,但上次我需要使用可观察的作为我的输出
。我的意思是,我想要获取输出,它每秒最多发出一次事件。所以我的代码看起来像:
@Output() loadNextEvent: Observable<any>;
loadNextSubject = new Subject();
constructor(private el: ElementRef) {
this.loadNextEvent = this.loadNextSubject.asObservable()
.throttleTime(1000); // once per second
}
emit() {
this.loadNextSubject.next('new event');
}
@Output()loadNextEvent:可以在StackOverflow上观察到,但我仍然不确定应该如何正确执行。就我而言:
@Output() loadNextEvent: Observable<any>;
loadNextSubject = new Subject();
constructor(private el: ElementRef) {
this.loadNextEvent = this.loadNextSubject.asObservable()
.takeUntil(this.loadNextSubject) //does it make any sense?
.throttleTime(1000); // once per second
}
emit() {
this.loadNextSubject.next('new event');
}
ngOnDestroy() {
this.loadNextSubject.complete();
}
@Output()loadNextEvent:可观察;
LoadNextObject=新主题();
构造函数(专用el:ElementRef){
this.loadNextEvent=this.loadnextObject.asObservable()
.takeUntil(this.loadNextSubject)//这有什么意义吗?
.throttleTime(1000);//每秒一次
}
发射(){
this.loadNextSubject.next(“新事件”);
}
恩贡德斯特罗(){
this.loadNextObject.complete();
}
问题:
这是取消订阅可观察输出的正确方法吗.takeUntil(this.loadNextSubject)
有什么意义吗?或者,.asObservable()
确保在主题
完成时,可观察对象已被清除?有人知道我的问题的答案吗?或者,可能有更好的解决方案,然后在我的案例中使用Observable
作为Output
如果要使用takeUntil
,则可观察的通知程序需要发出next
通知,而不仅仅是完成。所以正确的方法是这样的:
ngOnDestroy() {
this.loadNextSubject.next();
this.loadNextSubject.complete();
}
在这种情况下,也不需要使用asObservable()
。受试者是可观察的,因此使用asObservable()
只会用另一个不必要的可观察对象来包装它
还有一件事。在Angular 5中,有一个bug,它在将操作符链接到EventEmitter
时造成内存泄漏(该链未正确处理)。有关更多详细信息,请参见此处
这是固定在这里,应该可以从6
我想这正是你现在正在做的。在Angular 6之前避免这种情况的一种简单方法是在添加任何操作符之前使用asObservable()
。因此,如果我不使用.takeUntil(this.loadNextSubject)
,我可以只添加this.loadNextSubject.complete()代码>在ngondestory
中?或者.takeUntil(this.loadNextSubject)
是此结构所必需的,我必须添加this.loadNextSubject.next()
也是(before.complete)。如果要使用.takeUntil(this.loadNextSubject)
必须this.loadNextSubject.next()代码>。没有它,它就不会工作。