Angular 在zone.js中运行可观察到的
我有一个GPS插件,提供角度区域以外的位置。因此,角度传感器无法检测到这些变化,并且视图始终保持相同的值 当然,我可以从控制器订阅这个可观察的,然后做类似的事情Angular 在zone.js中运行可观察到的,angular,rxjs,zone.js,Angular,Rxjs,Zone.js,我有一个GPS插件,提供角度区域以外的位置。因此,角度传感器无法检测到这些变化,并且视图始终保持相同的值 当然,我可以从控制器订阅这个可观察的,然后做类似的事情 $mySourceOutOfZone.subscribe((value)=>{ this.zone.run(() => { this.value = value; }); }) 视图将简单地使用如下值: <span>{{value}
$mySourceOutOfZone.subscribe((value)=>{
this.zone.run(() => {
this.value = value;
});
})
视图将简单地使用如下值:
<span>{{value}}</span>
{{value}
但我希望避免订阅控制器和使用命令式方式
我怎么能让这个可观察到的东西在一个角度区域内运行呢?似乎有一个插件专门用于 可以使用以下命令将区域绑定到任何rxjs流
.enterZone(this.ngZone)
或使用管道操作符:
.pipe(enterZone(this.ngZone))
您也可以尝试此修补程序。
导入zone.js
后,在polyfills.ts
内添加此行
import `zone.js/dist/zone-patch-rxjs`;
因此,
subscription callback
将在调用时在区域中运行。subscripte
使用RxJs 6+时,自定义管道操作符可以将可观察对象的行为包装在指定区域的区域中。run()
从'rxjs'导入{Observable,OperatorFunction};
从“@angular/core”导入{NgZone};
导出函数runInZone(区域:NgZone):运算符函数{
返回(源)=>{
返回新的可观察对象(观察者=>{
const onNext=(值:T)=>zone.run(()=>observer.next(值));
const onError=(e:any)=>zone.run(()=>observer.error(e));
const onComplete=()=>zone.run(()=>observer.complete());
返回source.subscribe(onNext、onError、onComplete);
});
};
}
然后可以将操作符添加到可观察对象中,让您明确何时更改区域上下文
返回exampleObservable.pipe(
runInZone(this.zone)
);