【问题标题】:Deleting entire row angular 2 material?删除整行 angular 2 材料?
【发布时间】:2019-05-29 21:59:18
【问题描述】:

JSON

[
  { position: 1, name: 'test', value: 1.0079, symbol: 'HHH' },
  { position: 2, name: 'test2', value: 4.0026, symbol: 'BBB' },
  { position: 3, name: 'test3', value: 6.941, symbol: 'BB' },
  { position: 4, name: 'test4', value: 9.0122, symbol: 'CC' },
]

TS

  isAllSelected() {
    const numSelected = this.selection.selected.length;
    const numRows = this.dataSource.data.length;
    return numSelected === numRows;
  }

  removeSelectedRows() {
     this.selection.selected.forEach(item => {
      let index: number = this.data.findIndex(d => d === item);
      console.log(this.data.findIndex(d => d === item));
      this.dataSource.data.splice(index,1);

      this.dataSource = new MatTableDataSource<Element>(this.dataSource.data);
      setTimeout(() => {
        this.dataSource.paginator = this.paginator;
      });
    });
    this.selection = new SelectionModel<Element>(true, []);
  }

  /** Selects all rows if they are not all selected; otherwise clear selection. */
  masterToggle() {
    this.isAllSelected() ?
      this.selection.clear() :
      this.dataSource.data.forEach(row => this.selection.select(row));
  }
}

HTML

<div class="example-container mat-elevation-z8">

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

    <!-- Checkbox Column -->
    <ng-container matColumnDef="actions">
      <mat-header-cell *matHeaderCellDef>
      </mat-header-cell>
      <mat-cell *matCellDef="let row">
        <button mat-icon-button color="#b71c1c">
                    <mat-icon aria-label="Delete">delete</mat-icon>
                  </button>
      </mat-cell>
    </ng-container>

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

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

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

    <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
    <mat-row *matRowDef="let row; columns: displayedColumns;"
             (click)="selection.toggle(row)">
    </mat-row>
  </mat-table>


</div>

我想使用一键删除整行 解释 -> 当我点击删除按钮时,整行应该被删除,但在这里我正在做 API 调用,例如当我删除任何行时,它会将名称发送到 API!

这是我的 stackbliz 演示 -https://stackblitz.com/edit/delete-rows-mat-table-f5f7tr?file=app%2Ftable-selection-example.ts

【问题讨论】:

    标签: angular typescript angular-material


    【解决方案1】:

    添加删除行的函数:

      deleteRow(row) {
        this.dataSource.data.splice(row.position-1, 1);
        this.dataSource =  new MatTableDataSource<Element>(this.dataSource.data);
      }
    

    当点击删除按钮时在 HTML 中调用这个函数

    <button (click)="deleteRow(row)" mat-icon-button color="#b71c1c">
          <mat-icon aria-label="Delete">delete</mat-icon>
    </button>
    

    【讨论】:

    • @PrashantPimpale 能否请你看看我的新 Qn 对不起,但你总是给我一个简单的答案!
    【解决方案2】:

    你可以试试这个:

    HTML:

    <!-- Checkbox Column -->
    <ng-container matColumnDef="actions">
      <mat-header-cell *matHeaderCellDef> </mat-header-cell>
      <mat-cell *matCellDef="let row">
        <button mat-icon-button color="#b71c1c" (click)="removeSelectedRow(row)">
          <mat-icon aria-label="Delete">delete</mat-icon>
        </button>
      </mat-cell>
    </ng-container>
    

    TS:

    removeSelectedRow(row) {
        //const index = this.data.findIndex(obj => obj === row);
        const index = this.data.findIndex(obj => obj.codeData == row.codeData);
        this.data.splice(index, 1);
        this.dataSource = new MatTableDataSource<Element>(this.dataSource.data);
    }
    

    StackBlitz HERE

    结果:

    【讨论】:

    • findIndex() 方法返回数组中满足提供的测试函数的第一个元素的索引。而 this.data 指的是你的数据 => data = Object.assign(ELEMENT_DATA);
    • 每一行都包含 uniq 值,该 uniq 值是我的 this.codeData 值,所以我想在 codeData 值的引用中删除这一行,所以我如何在此处传递此值
    • 这种情况下删除的时候得到对象的codeData:const index = this.data.findIndex(obj =&gt; obj.codeData === row.codeData);我给你的数据加了codeData:{ codeData: 'ABC', position: 1, name: 'test', value: 1.0079, symbol: 'HHH' },...你可以去StackBlitz HERE,我改了。跨度>
    【解决方案3】:

    最好检查index != -1

    removeSelectedRows(row) {
        let index = ELEMENT_DATA.findIndex(x => x.position == row.position);
    
        if (index != -1) {
          ELEMENT_DATA.splice(index, 1)
        }
        this.dataSource = new MatTableDataSource<Element>(ELEMENT_DATA);
    }
    

    【讨论】:

    • 实际上删除图标有一个复选框,当我单击特定复选框时,它会获取代码列值,并根据代码列值删除整行!但是现在我没有复选框,所以当我想删除该行并单击删除图标时,该行代码值如何传递给 API?
    • 要删除复选框选中的行吗?
    • 完成!但添加 if 条件!
    • 疙瘩你能看看我的新Qn吗?
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 2017-05-02
    • 1970-01-01
    • 2020-05-09
    • 2019-01-19
    • 2018-03-19
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多