Angular Nativescript ActivityIndicator未正确侦听busy=变量

Angular Nativescript ActivityIndicator未正确侦听busy=变量,angular,nativescript,Angular,Nativescript,我正在创建一个小应用程序,每当向服务器发送请求时,我都希望在其中设置activityIndicator 因此,在我的UI服务中,我有一个主题,我在ActivityIndicator组件中收听它。结果:它开始忙,但即使指示符属性busy中的变量为false,它也不会停止 那么IDIndicator在初始化一次后不知何故没有刷新 我的UIService @Injectable({ providedIn: 'root'}) export class UiService { privat

我正在创建一个小应用程序,每当向服务器发送请求时,我都希望在其中设置activityIndicator

因此,在我的UI服务中,我有一个主题,我在ActivityIndicator组件中收听它。结果:它开始忙,但即使指示符属性busy中的变量为false,它也不会停止

那么IDIndicator在初始化一次后不知何故没有刷新

我的UIService

    @Injectable({ providedIn: 'root'})
export class UiService {
    private _drawerState=  new BehaviorSubject<void>(null);
    isLoading = new Subject<boolean>();

    get drawerState() {
        return this._drawerState.asObservable();
    }

    toggleDrawer() {
        this._drawerState.next(null);
    }

    setIsLoading(value: boolean) {
        this.isLoading.next(value);
    }

}
下面是ActivityIndicatorComponent的xml

<ActivityIndicator #indicator row="1" col="1" width="50" height="50" busy="{{isLoading}}" color="#6495ed"></ActivityIndicator>

我通过在ActivityIndicator组件中使用ChangeDetectorRef修复了它


收到订阅的新值后,我称为changeRef.detectChanges;它可以工作

套接字可能在角度区域之外运行,因此当变量发生更改时,它会向您的对象发送更新,并且由于它在区域之外,因此不会触发更改检测

这可以通过两种方式解决:

正如您已经修复的,通过手动调用detectChanges 使用ngZone.run=>{/*code*/}在角度区域内运行; 您还可以使用这个可观察操作符来确保代码在区域内运行

import { NgZone } from '@angular/core';
import { Observable } from 'rxjs/Observable';

export function enterZone(zone: NgZone) {
  return <T>(source: Observable<T>) =>
    new Observable<T>(observer =>
      source.subscribe({
        next: (x) => zone.run(() => observer.next(x)),
        error: (err) => observer.error(err),
        complete: () => observer.complete()
    })
   );
}

你能分享一个游乐场的例子吗?这个问题可以复制出来吗?谢谢!看起来棒极了。您能用示例代码向我展示一下我的UiService吗?这样:isLoading$=this.isLoading.pipeenterZonengZone可以工作吗?我无法让它工作。我已经用示例更新了答案。您所要做的就是订阅isLoading$,而不是isLoading。您甚至可以将isLoading设置为Private,而不必在订阅服务器中调用change detector或zone。然而,真正的问题可能是你的服务遗漏了一些其他东西。
<ActivityIndicator #indicator row="1" col="1" width="50" height="50" busy="{{isLoading}}" color="#6495ed"></ActivityIndicator>
import { NgZone } from '@angular/core';
import { Observable } from 'rxjs/Observable';

export function enterZone(zone: NgZone) {
  return <T>(source: Observable<T>) =>
    new Observable<T>(observer =>
      source.subscribe({
        next: (x) => zone.run(() => observer.next(x)),
        error: (err) => observer.error(err),
        complete: () => observer.complete()
    })
   );
}