Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.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
Angular 如何将@Output取消订阅为可观察_Angular_Rxjs_Rxjs5 - Fatal编程技术网

Angular 如何将@Output取消订阅为可观察

Angular 如何将@Output取消订阅为可观察,angular,rxjs,rxjs5,Angular,Rxjs,Rxjs5,我有一个关于取消订阅Angular中的Outputs的问题。我知道EventEmitter会自动清理,但上次我需要使用可观察的作为我的输出。我的意思是,我想要获取输出,它每秒最多发出一次事件。所以我的代码看起来像: @Output() loadNextEvent: Observable<any>; loadNextSubject = new Subject(); constructor(private el: ElementRef) { this.loadNextEvent

我有一个关于取消订阅Angular中的
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()。没有它,它就不会工作。