【问题标题】:material table datasource from firebase来自firebase的材料表数据源
【发布时间】:2018-08-07 08:56:35
【问题描述】:

您好,我正在使用 angular 材料 5 和 angular 5 以及 angularFirebase2 版本 5。 我能够获取数据源并显示材料表,但是当我尝试从 firebase 列表中提取数据时,它不会在表中显示数据。

在我的组件内部:

public result;

dataSource = new MatTableDataSource(this.result);

constructor(private db : AngularFireDatabase) {
  this.result = this.db.list('sellEntries').valueChanges();
}
 <div class="example-container mat-elevation-z8">
            <div class="search-bar">
                <mat-form-field>
                    <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
                </mat-form-field>
                <button mat-raised-button color="primary" (click)="applyFilter('')">All</button>
                <button mat-raised-button color="primary" (click)="applyFilter('india')">India</button>
                <button mat-raised-button color="primary" (click)="applyFilter('south africa')">South Africa</button>
            </div>
                <mat-table #table [dataSource]="dataSource">



                    <ng-container matColumnDef="position">
                        <mat-header-cell *matHeaderCellDef> No. </mat-header-cell>
                        <mat-cell *matCellDef="let element"> {{element.position}} </mat-cell>
                    </ng-container>


                    <ng-container matColumnDef="material">
                        <mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
                        <mat-cell *matCellDef="let element"> {{element.material}} </mat-cell>
                    </ng-container>


                    <ng-container matColumnDef="weight">
                        <mat-header-cell *matHeaderCellDef> Weight </mat-header-cell>
                        <mat-cell *matCellDef="let element"> {{element.weight}} </mat-cell>
                    </ng-container>

                    <ng-container matColumnDef="country">
                        <mat-header-cell *matHeaderCellDef> Symbol </mat-header-cell>
                        <mat-cell *matCellDef="let element"> {{element.country}} </mat-cell>
                    </ng-container>

                    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
                    <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
                </mat-table>
            </div>

如果我使用组件绑定,表格可以正常工作并加载数据。我正在寻找一种从 Firebase 实时数据库加载数据源的方法。提前致谢

【问题讨论】:

  • 您是否尝试使用构造函数或 ngOnInit 中的实际可观察​​对象来创建它,而不是改变数据源? this.dataSource = new MatTableDataSource(this.db.list('sellEntries').valueChanges());
  • @funkizer ,我认为这行不通,因为 MatTableDataSource 期望一个数组作为参数,而 valueChanges() 返回一个 observable。
  • Aoki,我认为它也可以观察到,因为 op 没有提到 IDE 警告或任何东西,如果它没有警告,那就是糟糕的 IDE。 :) 我总是使用自定义 DS 扩展 TableDataSource,在 connect 方法中只返回 observable。
  • 不是一个糟糕的 IDE,糟糕的 IDE 用户。您应该输入 result 作为 Observable,然后您可能会收到警告和构建错误。总是打字! Typescript 可以帮助您非常轻松地捕获这些错误 :)

标签: angular firebase angular-material angularfire2


【解决方案1】:

正如 cmets 中所指出的,MatTableDataSource 的构造函数需要一个数组。您应该始终键入变量,以便您的 IDE 和构建过程让您了解此类摸索。两种方法,a) 扩展 DataSource 类:

class MyDataSource<T> extends DataSource<T> {
    constructor(private observable: Observable<T[]>) {}
    connect() {
        return this.observable;
    }
}
// Component: 
dataSource: MyDataSource<any>;
ngOnInit() {
    this.dataSource = new MyDataSource(this.db.list('sellEntries').valueChanges());
}

b) 订阅并手动设置数据:

destroy$:Subject<void> = new Subject();
ngOnInit() {
    this.dataSource = new MatTableDataSource([]);
    this.db.list('sellEntries').valueChanges().pipe(
        takeUntil(destroy$); // Complete & cleanup
    ).subscribe(data => this.dataSource.data = data);
}
ngOnDestroy() {
    this.destroy$.next();
}

就我个人而言,我会选择 a),因为该类是可重用的并且使组件更精简。

【讨论】:

  • 谢谢,它现在可以工作了,我忘了更新 html 部分并在 mat-row 中绑定正确的键。使用上述解决方案可以正常工作。谢谢。
  • np,很高兴听到 :)
猜你喜欢
  • 2021-02-08
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多