这些进口添加到您的组件
import 'rxjs/add/operator/takeUntil';
import { Subject } from 'rxjs/Subject';
在你的类添加这个 - 我通常做这种构造之上。
private ngUnsubscribe: Subject<any> = new Subject<any>()
添加ngOnDestroy功能
ngOnDestroy() {
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
,然后添加这立即您.subscribe之前(你应该在每一个部件与.subscribe倍数之前使用这个确切的语法)。
.takeUntil(this.ngUnsubscribe)
所以在你的情况下,它看起来像这样。
watchMethod(){
this.geolocation.watchPosition()
.takeUntil(this.ngUnsubscribe)
.subscribe(resp => {
let userLatLong = { "lat": resp.coords.latitude, "lng": resp.coords.longitude };
console.log('is watching')
});
}
所以会发生什么是订阅将保持活动状态,直到从组件导航离开,此时ngOnDestroy其从可观察退订干净火灾。
如果你想手动停止不留组件订阅,你可以这样做:
stopWatching(){
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}
请注意,您还可以删除this.watchPosition实例变量,这似乎只是被用作开销支持.subscribe方法的脚手架。
编辑:我能想到的唯一的事情是按钮单击创建多个事件,它导致.subscribe多次触发。
也许在你的按钮中,包含$ event作为参数,然后在你的函数中调用stopPropagation事件。
<button (click)="watchMethod($event)">Watch Method </button>
并更新watchMethod:
watchMethod(event){
event.stopPropagation();
this.geolocation.watchPosition()
.takeUntil(this.ngUnsubscribe)
.subscribe(resp => {
let userLatLong = { "lat": resp.coords.latitude, "lng": resp.coords.longitude };
console.log('is watching')
});
}
你能否扩大* “没有工作” *。错误?意外的输出? – jonrsharpe
这就是问题所在,我没有收到任何错误!没有输出。唯一的是我看到'watchMethod()'继续运行,因为控制台打印'正在监视' –
然后*在问题*中提及,这是[mcve]的一部分。你似乎有[问这两次](https://stackoverflow.com/q/45654369/3001761),只有微小的差异;为什么? – jonrsharpe