angular - 没有错误,但 `md-table` 未渲染数据(未调用 `connect()`)

标签 angular angular-material2

我正在尝试实现 Angular Material Table. 。问题是我没有收到任何错误,但没有输出。我没有使用典型的例子,但正在尝试使用我自己的数据来实现。

  • 我错过了什么?
  • dataSource 对象是否具有特定的数据格式?

如果我错了,请纠正我,但根据我对以下文档的理解,如果将 dataSource 设置为 array,它应该可以工作。

Data is provided to the table through a DataSource. When the table receives a data source, it calls the DataSource's connect function which returns an observable that emits an array of data. Whenever the data source emits data to this stream, the table will update.

下面是我的代码。

HTML:

<div class="example-container mat-elevation-z8">
  <label> Testing </label>
  <md-table #table [dataSource]="dataSource">


    <ng-container cdkColumnDef="dbquery">
      <md-header-cell *cdkHeaderCellDef>dbquery </md-header-cell>
      <md-cell *cdkCellDef="let row"> {{row.dbquery}} </md-cell>
    </ng-container>

    <md-header-row *cdkHeaderRowDef="columns"></md-header-row>
    <md-row *cdkRowDef="let row; columns: columns;"></md-row>

  </md-table>
</div>

TS:

    import { Component, OnInit , Input,OnChanges } from '@angular/core';
import {DataSource} from '@angular/cdk';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import {Observable} from 'rxjs/Observable';

@Component({
  selector: 'app-data-table',
  templateUrl: './data-table.component.html',
  styleUrls: ['./data-table.component.css']
})
export class DataTableComponent implements OnInit {
  @Input() tabledata : any;
  private headers : any;
  private columns : any;

  public dataSource: BindDataTableSource | null;

  dataChange: BehaviorSubject<any> = new BehaviorSubject<any>([{}]);
  get data(): [{}] { console.log("getData is called ",this.dataChange.value) ;return this.dataChange.value; }

  constructor(){};
  ngOnInit() {
    this.dataSource = new BindDataTableSource(this);

    this.headers = this.tabledata.headers;
    this.columns = this.tabledata.columns;

    console.log("inside nginit ",this.dataSource);
    console.log(this.headers);
    console.log(this.columns);

  }


}

export class BindDataTableSource extends DataSource<any>{

  constructor(private datatable : DataTableComponent){

    super();
    console.log(this.datatable.tabledata.data);
    for(let index = 0 ; index < this.datatable.tabledata.data.length ; index++){
//      console.log(this.datatable.tabledata.data[index]);
      this.datatable.dataChange.next(this.datatable.tabledata.data[index]);
    }

//     this.datatable.dataSource = this.datatable.data.data;
//    console.log("inside bindatatablsource ",this.datatable.dataSource);

  }
  connect() : Observable<[{}]> {

    console.log("connect is called ->  ",this.datatable.dataChange);
    return this.datatable.dataChange;
  }

  disconnect(){};

}

下面是我的控制台输出

Console Output

感谢您的帮助。

P.S - 文档很糟糕。

最佳答案

https://github.com/angular/material2/issues/5593

错误中提到了解决方法。

需要强制进行更改检测。

this.changeDetector.detectChanges();

此后为我工作。

关于angular - 没有错误,但 `md-table` 未渲染数据(未调用 `connect()`),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45191959/

相关文章:

Angular 2.0,如何检测子组件上的路由更改

javascript - 我如何确定在 Angular Material 对话框中单击了哪个按钮

Angular 2 Component 不是任何 NgModule 的一部分

angular - 如何通过单击具有 RouterLink 指令的元素来关闭 Material SideNav?

android - Angular Material 对话框动画在移动设备上非常慢

Angular2 - 参数 $event 隐式具有 'any' 类型

angular - Angular `HttpClient` `.get()` 泛型可以有非简单的属性类型吗? (例如 `string` 或 `number` 除外)

angular - 使用 mat-error 显示自定义验证器错误

angular - 使用导入模块对 angular2 组件进行单元测试

css - 如何在没有 SCSS 的情况下应用自定义 Angular Material Theme?