Angular Material mat-table未显示数据源中的更新数据

时间:2018-06-14 03:08:27

标签: angular angular-material

我的简单任务是将输入框中输入的文本添加到mat-table中,但它没有按预期工作。数据源只刷新一次,并且没有显示更新数据从第二次开始。

这是我的代码app.component.html

 <div class="main" fxLayout="column" fxGap="10">
   <div class="input-area">
     <mat-form-field>
        <input matInput placeholder="Type something" [(ngModel)]="currentText"> 
     </mat-form-field>
     <button mat-raised-button color="primary" style="margin-left:10px;" (click)="onAdd($event)">Add</button>
   </div>
   <div class="result-area">
      <mat-table #table [dataSource]="dataSource" class="mat-elevation-z8">
        <ng-container matColumnDef="name">
         <mat-header-cell #th *matHeaderCellDef> Name </mat-header-cell>
         <mat-cell #td *matCellDef="let element"> {{element.name}} </mat-cell>
        </ng-container>
        <mat-header-row #tr *matHeaderRowDef="displayedColumns"></mat-header-row>
        <mat-row #tr *matRowDef="let row; columns: displayedColumns;"></mat-row>
      </mat-table>
   </div>

这是我的&#34; app.component.ts&#34;其中包含&#34;添加&#34;更新表数据源的事件。

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  currentText: string= "";
  displayedColumns = ['name'];
  data: Data[] = [];
  dataSource: Data[];

  constructor(){}

  onAdd($event){
   this.data.push({name: this.currentText});
   this.dataSource = this.data;
  }
}

interface Data{
  name: string;
}

我做错了什么? 以下是上述code

的stackblitz示例

感谢您的帮助。

4 个答案:

答案 0 :(得分:10)

对dataSource的引用保持不变,因此材料不知道您的源已更改。

尝试

this.dataSource = [...this.data];

<强> Forked Stackblitz

或使用BehaviorSubject之类的:

dataSource = new BehaviorSubject([]);

onAdd($event){
  this.data.push({name: this.currentText});
  console.log(this.data);
  this.dataSource.next(this.data);
}

<强> Forked Stackblitz

答案 1 :(得分:4)

而不是push使用concat让table知道你修改了对象

   this.data = this.data.concat([{name: this.currentText}]);

答案 2 :(得分:0)

只需隐藏表,直到显示数据然后显示。很简单,但是有效。我为此使用* ngIf =“ ...”和Angular。

答案 3 :(得分:0)

可以用新数据重建表。

this.tableData = this.dataSource.data;
this.dataSource.data = this.tableData.push(newRecord);
this.dataSource = new MatTableDataSource<any>(this.tableData);