【问题标题】:Akita query this.selectAll returning empty list before service call completes秋田查询 this.selectAll 在服务调用完成之前返回空列表
【发布时间】:2021-09-13 09:41:21
【问题描述】:

这是我的 widgetquery.ts

@Injectable({ providedIn: 'root' })
export class WidgetQuery extends QueryEntity<WidgetState, WidgetTO> {
  public Widget$: Observable<WidgetTO> = this.selectActive().filter(k => !!k);
  public WidgetHistorikk$: Observable<WidgetTO[]> = this.selectAll({sortBy: 'WidgetId', sortByOrder: Order.DESC}).filter(k => !!k);

  constructor(protected store: WidgetStore) {
    super(store);
  }
}

在前端我像这样使用 *ngIf:

 <ng-container *ngIf="widgetHistorikk$ | async"> ... </ng-container>

我的组件中的构造函数调用这个函数,从服务调用中获取小部件(服务调用成功...)

  private fetchWidgetHistorikk() {
    this.WidgetService.getWidgetHistorikk().filter(h => !!h).subscribe(liste => {
      this.WidgetStore.add(liste);
    });
  }

但是 selectAll 查询在返回实际数据 [ widget1, widget2 ] 之前返回一个空列表 [ ]

所以我得到一个空列表,然后是真实数据(填充列表)。

我不想要先出现的空列表(即使实际数据有时可能是空列表)...

为什么我会从秋田获得第一个空列表?

我可以使用某种“标志”或“初始化状态”来告诉秋田:在我的服务调用完成之前不要从查询中返回数据,并且数据通过这一行this.WidgetStore.add(liste); 添加到存储中?

【问题讨论】:

    标签: angular typescript state-management angular-akita akita


    【解决方案1】:

    如果您使用实体存储,您可以在初始状态下简单地将 loading 设置为 true,在收到响应后您可以将其更改为 false,并在查询中检查状态是否正在加载显示一些正在加载的 UI 或执行随心所欲。

    store.setLoading(true);
    

    您也可以使用combineLatest 或在加载完成时获取数据。

    【讨论】:

      【解决方案2】:

      您得到的是空列表,因为 Akita 总是发出初始值,如 docs 中所述。您可以使用 rxjs skip(1) 跳过它(或过滤掉空/未定义的值)

      如果你只是不想在 UI 上显示空白内容,你可以说

      <ng-container *ngIf="(widgetHistorikk$ | async)?.length > 0"> ... </ng-container>
      

      第三种选择是在商店的加载状态为真时隐藏内容

      【讨论】:

      • 谢谢。如何过滤 *ngIF="..." 中的加载状态?
      • @vikingsteve 你可以将它存储在一个变量(loading$: Observable&lt;boolean&gt;)中,然后像任何其他变量一样在你的模板中使用它
      猜你喜欢
      • 2020-10-26
      • 2014-12-30
      • 2014-01-03
      • 2021-02-15
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      相关资源
      最近更新 更多