如何解决承诺完成后,Angular不会更新UI
我提供以下服务:
@Injectable({ providedIn: 'root' })
export class ContextService {
contextSubject = new ReplaySubject<ContextModel>(1);
context: ContextModel = {};
setContext(context: ContextModel) {
console.log('contest service set context');
console.dir(context);
this.context = context;
this.contextSubject.next(this.context);
}
public get contextObservable(): Observable<ContextModel> {
return this.contextSubject.asObservable();
}
}
我已将此服务注入组件中,并且正在订阅它。
async ngOnInit() {
this.contextService.contextObservable.pipe(takeUntil(this.subDestroy)).subscribe(async () => {
await this.loadData();
});
}
...
async loadData() {
this.loading = true;
await this.dataSource.query();
this.loading = false;
setTimeout(() => { this.cd.detectChanges(); },500);
}
调用角材料数据源方法:
async query():Promise<void> {
...
let result = await this.inventoryService.query(skip,take,(item : InventoryItem) => { return this.filterFunc(item) },this.sort);
...
}
依次调用返回一些伪数据的服务
async query(skip = 0,take = 20,filters : (obj: InventoryItem) => boolean,sort : Sort) : Promise<PagedResult<InventoryItem>> {
let p = new Promise<PagedResult<InventoryItem>>((resolve,reject) => {
let res : PagedResult<InventoryItem> = {
count: 1,items: [
{
id: '1',name: 'a',quantity: 123,rarity: 'b',subtype: 'c',type: 'd'
}
],};
setTimeout(() => {
resolve(res);
},1000);
});
return p;
}
然后从某处执行以下操作:
this.contextService.setContext({ ... });
我的问题如下:
在第一页加载时,一切都很好。
之后,如果我不调用cd.detectChanges()
,则UI会一直保持加载状态,或者直到我单击表单元素(例如输入)。
我不知道是否有以下问题:使用角度元素将顶层组件导出为Web组件。我使用的是角材,页面上有角材表和进度条。
编辑:实际上,我必须使用setTimeout(() => { this.cd.detectChanges(); },500);
才能使其正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。