【问题标题】:Angular Material Table won't populate with external data on initial loadAngular Material Table 不会在初始加载时填充外部数据
【发布时间】:2018-12-02 23:47:37
【问题描述】:

我正在开发一个 Angular 6 项目,我正在通过 Observable 将 AWS DynamoDB 表中的数据加载到 Material Table 组件中。我使用 angular-cli 生成表的初始结构,然后添加我自己的服务来获取外部数据,因为该示例使用数组中的硬编码数据。

一切似乎都在工作(我可以看到通过 console.log 返回的正确数据),除了在我的初始加载时,我从 observable 返回的数据没有填充到表中。事实上,如果我检查“this.data”变量,它似乎立即被设置回“未定义”。如果我在分页组件上选择并更改每页的结果数,则插入 observable 返回的数据。

connect(): Observable<DynamoTableItem[]> {
    // Combine everything that affects the rendered data into one update
    // stream for the data-table to consume.
    const dataMutations = [
        observableOf(this.data),
        this.paginator.page,
        this.sort.sortChange
    ];

    // Set the paginators length
    this.paginator.length = this.data.length;

    return merge(...dataMutations).pipe(map(() => {
        return this.getPagedData(this.getSortedData([...this.data]));
    }));
}

如果有人不介意看一下,我已将该项目放在 stackblitz 上。

重现问题:

  1. 转至:https://stackblitz.com/edit/mat-table-dynamo
  2. 注意表中没有数据。
  3. 选择“每页项目数”下拉菜单并更改为其他值。
  4. 该表填充了从 Observable 返回的数据。

感谢您的帮助!

【问题讨论】:

    标签: javascript angular datatable rxjs angular-material


    【解决方案1】:

    使用 Angular 编写任何服务的经验法则是,如果您的服务中有 .subscribe(),那么您可能 (99%) 做错了。始终返回Observable,并让您的组件执行.subscribe()

    您的代码不起作用的原因是您首先在服务中订阅数据,然后使用Observable.of() 重新包装它。那行不通,因为您的 http 调用是异步的。当您在构造函数中的订阅收到发射时,您的 connect 早已建立,this.data 在可以分配任何值之前首先是未定义的。

    要解决您的问题,只需将of(this.data) 更改为其原始Observable 源,一切正常:

    connect(): Observable<DynamoTableItem[]> {
        // Combine everything that affects the rendered data into one update
        // stream for the data-table to consume.
        const dataMutations = [
            this.dynamoService.getData(this.params),
            this.paginator.page,
            this.sort.sortChange
        ];
    
        // Set the paginators length 
        this.paginator.length = this.data.length;
    
        return merge(...dataMutations).pipe(map((received) => { 
            return this.getPagedData(this.getSortedData([...received]));
        }));
    }
    

    这是工作的working StackBlitz

    【讨论】:

    • 非常感谢! Observable.of() 是静态示例数据遗留下来的,我忽略了它。
    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2020-02-01
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多