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