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 在zone.js中运行可观察到的_Angular_Rxjs_Zone.js - Fatal编程技术网

Angular 在zone.js中运行可观察到的

Angular 在zone.js中运行可观察到的,angular,rxjs,zone.js,Angular,Rxjs,Zone.js,我有一个GPS插件,提供角度区域以外的位置。因此,角度传感器无法检测到这些变化,并且视图始终保持相同的值 当然,我可以从控制器订阅这个可观察的,然后做类似的事情 $mySourceOutOfZone.subscribe((value)=>{ this.zone.run(() => { this.value = value; }); }) 视图将简单地使用如下值: <span>{{value}

我有一个GPS插件,提供角度区域以外的位置。因此,角度传感器无法检测到这些变化,并且视图始终保持相同的值

当然,我可以从控制器订阅这个可观察的,然后做类似的事情

$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)
);