Angular - NGXS 在查看前加载数据时出现问题

Angular - NGXS problem with loading data before view

您在路由到组件并加载 table 时遇到过问题吗?但是 table 是空的,没有数据。

我的意思是显示组件/ table。我看到的数据处于状态(会话存储)并已加载。如果我刷新页面,我可以显示它们。

顺便说一句,我可以在这个组件之前发送状态,我的问题可以得到解决,或者使用简单的服务调用 api。但这对我来说不是解决方案。

所以我的问题是=如何在查看之前显示/加载数据?

我的assets.state.ts

    @Action(SetDevice)
  async setDevice({ patchState, dispatch }: StateContext<DeviceDataModel>) {
    return await this.deviceListService.getData().subscribe((response: DeviceDataModel) => {
      console.log(response);
      patchState({
        data: response.data,
        dataSet: response.dataSet,
        offset: response.offset,
        size: response.size,
      });
      dispatch(new SetDeviceSuccess());
    });
  }

组件 - 将数据设置为状态并将它们加载到 table some.component.ts

ngOnInit(): void {
    this.store.dispatch(new SetDevice());
    this.getTableData();
  }

getTableData() {
    this.tableData = this.store.selectSnapshot(DeviceState.getDataDevice);
  }

some.component.html

 <dynamic-table
        style="width: 85%;"
        *ngIf="tableData"
        [tableData]="tableData.data"
        [tableColumns]="tableCols"
        [url]="'devicelist'"
      ></dynamic-table>

提前感谢您的帮助或想法。

很可能您调用 selectSnapshot 时您的数据尚未加载。你最好使用 @Select 语句:

@Select(DeviceState.getDataDevice)
readonly tableData$!: Observable<any>;

ngOnInit(): void {
  this.store.dispatch(new SetDevice());
}

并让您的模板使用 async 管道:

<dynamic-table *ngIf="tableData$ | async as tableData"
   [tableData]="tableData.data"
   [tableColumns]="tableCols"
   [url]="'devicelist'">
</dynamic-table>

除此之外,您的 @Action 处理程序也是错误的,这不是您使用 async/await 和 Observable 的方式。您需要 return 来自动作处理程序的 Observable,以确保当动作完成时,并且您订阅了调度,它会在那时完成:

@Action(SetAssets)
setWorkflows({ patchState, dispatch }: StateContext<AssetDataModel>) {
  return this.assetListService.getData().pipe(
    switchMap((response: AssetDataModel) => {
      patchState({
        data: response.data,
        dataSet: response.dataSet,
        offset: response.offset,
        size: response.size,
      });

      return dispatch(new SetDeviceSuccess());
    })
  )
}

问题是您在加载数据之前调用了 this.getTableData(); 函数。

some.component.ts

    @Select(state => state.youdata) yourdata$: Observable<any>;

    ngOnInit(): void {
        this.store.dispatch(new SetDevice()); 
     }

some.component.html

 <dynamic-table
            style="width: 85%;"
            *ngIf="tableData"
            [tableData]="tableData.data | async"
            [tableColumns]="tableCols"
            [url]="'devicelist'"
          ></dynamic-table>

我用 toPromise() 和 then() 解决了这个问题。我知道这不是最好的方法。但现在它的工作。

所以我只是用下面的代码替换了这段代码。

   ngOnInit(): void {
    this.store.dispatch(new SetDevice());
    this.getTableData();
  }

getTableData() {
    this.tableData = this.store.selectSnapshot(DeviceState.getDataDevice);

  }

首先我显示微调器,在收到数据后我只是隐藏微调器并显示 table 感谢 .then()

 ngOnInit(): void {
     this.store
      .dispatch(new SetAccount())
      .toPromise()
      .then((result) => {
       console.log(res);
       this.getTableData();
      });
}