代码之家  ›  专栏  ›  技术社区  ›  Flavien Volken

将一个可观察到的对象运行到zone.js

  •  1
  • Flavien Volken  · 技术社区  · 7 年前

    我有一个GPS插件提供了一个角度区域的位置。因此,这些变化不是通过角度来检测的,并且视图始终停留在相同的值上。

    当然,我可以订阅从控制器中观察到的并做类似的事情。

    $mySourceOutOfZone.subscribe((value)=>{
                this.zone.run(() => {
                    this.value = value;
                });
    })
    

    视图将简单地使用如下值:

    <span>{{value}}</span>
    

    但我希望避免订阅控制器并使用命令式方式。

    我怎么能让这个可观测到的东西在一个角区内运行呢?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Flavien Volken    7 年前

    似乎有一个插件专门用于 rxjs and zones:

    可以使用 .enterZone(this.ngZone)

        2
  •  0
  •   jiali passion    7 年前

    你也可以试试这个补丁。 在里面加上这一行 polyfills.ts 进口后 zone.js .

    import `zone.js/dist/zone-patch-rxjs`;
    

    所以 subscription callback 会在区域内运行 .subscribe .

        3
  •  0
  •   Nickson    6 年前

    当使用rxjs 6+时,自定义管道操作符可以在 zone.run() 对于指定区域。

    import { Observable, OperatorFunction } from 'rxjs';
    import { NgZone } from '@angular/core';
    
    export function runInZone<T>(zone: NgZone): OperatorFunction<T, T> {
      return (source) => {
        return new Observable(observer => {
          const onNext = (value: T) => zone.run(() => observer.next(value));
          const onError = (e: any) => zone.run(() => observer.error(e));
          const onComplete = () => zone.run(() => observer.complete());
          return source.subscribe(onNext, onError, onComplete);
        });
      };
    }
    

    然后,可以将运算符添加到可观察对象中,让您明确何时更改区域上下文。

    return exampleObservable.pipe(
      runInZone(this.zone)
    );
    
    推荐文章