【问题标题】:How to delete particular row from angular material table which doesnt have filters?如何从没有过滤器的角度材料表中删除特定行?
【发布时间】:2022-04-11 19:48:29
【问题描述】:

我的 samplepage.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-batchticketvalidation',
  templateUrl: './batchticketvalidation.component.html',
  styleUrls: ['./batchticketvalidation.component.css']
})
export class BatchticketvalidationComponent {

  constructor() { }

  displayedColumns = ['id', 'ticketnumb', 'actionsColumn'];
  dataSource: PeriodicElement[] = ELEMENT_DATA;
  private myDataArray: any;

  deleteTicket(rowid: number) {
    if (rowid > -1) {
      this.myDataArray.splice(rowid, 1);
    }
  }
}

export interface PeriodicElement {
  id: number;
  ticketnumb: string;
  actionsColumn: any;
}

const ELEMENT_DATA: PeriodicElement[] = [
];

我的示例页面.component.html

<table mat-table [dataSource]="myDataArray" >
   <!-- <ng-container [matColumnDef]="column" *ngFor="let column of displayedColumns" >
      <th mat-header-cell *matHeaderCellDef > {{column}} </th>
      <td mat-cell *matCellDef="let element" > {{element[column]}} </td>
      </ng-container> -->

   <ng-container matColumnDef="id">
      <th mat-header-cell *matHeaderCellDef> Id. </th>
      <td mat-cell *matCellDef="let element; let i = index;"> {{i+1}} </td>
   </ng-container>

   <ng-container matColumnDef="ticketnumb">
      <th mat-header-cell *matHeaderCellDef> Ticket Number </th>
      <td mat-cell *matCellDef="let element"> {{element.ticketnumb}} </td>
   </ng-container>

   <ng-container matColumnDef="actionsColumn">
      <th mat-header-cell *matHeaderCellDef> Action </th>
      <td mat-cell *matCellDef="let element;  let j = index;"> 
         <button mat-raised-button  color="warn" focusable="false" (click)="deleteTicket(j)">
         <i class="fa fa-times mat-icon"></i> Remove
         </button>
      </td>
   </ng-container>

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

我是 Angular 的新手。我需要帮助从表中删除特定行,一旦删除该行,表应该得到刷新或者它应该显示现有数据。我只有静态行。这只是我想向客户展示的一个简单的样机 html。

每一行都有删除按钮,点击删除按钮我调用 deleteTicket(rowid)。

当触发 deleteTicket 方法时,该行不会从 Ui 中删除,但是当我控制台 this.myDataArray 时,数据会从对象中删除。

我尝试了所有的可能性。

【问题讨论】:

  • 你可以试试 - this.changeDetectorRefs.detectChanges();
  • @rakesh 提供新的this.myDataArray 作为新的数据源对象。拼接数组后可以像this.myDataArray= new MatTableDataSource(this.myDataArray);一样使用

标签: angular mat-table


【解决方案1】:

splice() 按项目索引之后,您应该更新数据源

const index = this.dataSource.data.indexOf(item.id);
this.dataSource.data.splice(index, 1);
this.dataSource._updateChangeSubscription(); // <-- Refresh the datasource

【讨论】:

  • 你应该使用this.dataSource.data.splice(index, 1) 否则splice 方法将删除所有索引大于或等于item的项目
  • 工作就像一个魅力,但额外注意:如果您使用分页器或排序材料表,请记住更新它们。 (例如this.dataSource.paginator = this.paginator; this.dataSource.sort = this.sort;
【解决方案2】:

删除选中的行后,需要重新分配matDataTable。

deleteTicket(rowid: number){
  // raw_data is the array of data that you getting from the db.
  this.raw_data.splice(rowid,0)
  this.dataSource = new MatTableDataSource(this.users);   
}

【讨论】:

    【解决方案3】:

    问题在于不变性在游戏中:初始化后的mat-table只监听数据源引用

    <table mat-table [dataSource]="myDataArray">
    

    所以数据源引用应该在更改其内容后以某种方式更新,例如

      deleteTicket(rowid: number) {
        if (rowid > -1) {
          this.myDataArray.splice(rowid, 1);
          this.myDataArray = [...this.myDataArray]; // new ref!
        }
      }
    

    或者更简单

      deleteTicket(rowid: number) {
        this.myDataArray = this.myDataArray.filter((item, index) => index !== rowid);
      }
    

    【讨论】:

      【解决方案4】:

      下面的代码对我有用

      removeData(i){
       this.count.splice(i,1);
       this.dataSource = new MatTableDataSource(this.count);
      }
      

      【讨论】:

        【解决方案5】:

        首先,找到特定元素的索引 let idx = this.SPARE_REQUESTED_DATA.findIndex((obj) =&gt; obj._id == id); 之后点击删除该元素 this.dataSource.data.splice(idx, 1) // first argument idx of element and second argument how many items remove after that index 之后刷新数据源 this.dataSource._updateChangeSubscription() 如果您正在使用分页和过滤器,则更新更改订阅 this.dataSource.sort = this.sort //Your sort method this.dataSource.pagination = this.paginator //Your pagination method this.cdr.detectChanges() //changeDetectRef 方法从角度实现它在你的构造

        【讨论】:

          【解决方案6】:

          我建议使用MatTableDataSource

          dataSource: MatTableDataSource = new MatTableDataSource<T>(ELEMENT_DATA);
          
          deleteFunction(item){
              // find item and remove ist
              dataSource.data.splice(this.dataSource.data.indexOf(item.id), 1);
          }
          

          【讨论】:

          • pop 只返回元素中的最后一项?
          猜你喜欢
          • 2018-10-01
          • 2022-11-18
          • 1970-01-01
          • 2018-09-22
          • 1970-01-01
          • 2017-11-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多