【问题标题】:Problem when trying to implement selection table of angular material尝试实现角材料选择表时出现问题
【发布时间】:2019-08-27 21:42:58
【问题描述】:

我正在尝试在我的角度材料表中实现选择列,我按照页面上指定的所有步骤进行操作:https://material.angular.io/components/table/examples 但它对我不起作用(它不显示该列)并且可悲问题是它没有向我显示任何错误。我留下一些代码:

表:

<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">

<ng-container matColumnDef="select">
    <th mat-header-cell *matHeaderCellDef>
        <mat-checkbox (change)="$event ? masterToggle() : null" [checked]="selection.hasValue() && isAllSelected()" [indeterminate]="selection.hasValue() && !isAllSelected()" [aria-label]="checkboxLabel()">
        </mat-checkbox>
    </th>
    <td mat-cell *matCellDef="let row">
        <mat-checkbox (click)="$event.stopPropagation()" (change)="$event ? selection.toggle(row) : null" [checked]="selection.isSelected(row)" [aria-label]="checkboxLabel(row)">
        </mat-checkbox>
    </td>
</ng-container>

<ng-container matColumnDef="rec_fechaAlta">
    <th mat-header-cell *matHeaderCellDef>Fecha Alta</th>
    <td mat-cell *matCellDef="let element">{{ element.rec_fechaAlta }}</td>
</ng-container>

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

<ng-container matColumnDef="rec_direccion">
    <th mat-header-cell *matHeaderCellDef>Dirección</th>
    <td mat-cell *matCellDef="let element">{{ element.rec_direccion }}</td>
</ng-container>

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

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

ts 文件:

import { Component } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table';
import { SelectionModel } from '@angular/cdk/collections';

export interface ReclamoPendiente {
  rec_fechaAlta: string;
  tipRec_nombre: string;
  rec_direccion: string;
  bar_nombre: string;
}

let arrData: ReclamoPendiente[] = [];

@Component({
  selector: 'app-crear-orden-servicio',
  templateUrl: './crear-orden-servicio.component.html',
  styleUrls: ['./crear-orden-servicio.component.css']
})
export class CrearOrdenServicioComponent implements OnInit {

  displayedColumns: string[] = ['select', 'rec_fechaAlta', 'tipRec_nombre', 
'rec_direccion', 'bar_nombre'];
  dataSource = new MatTableDataSource<ReclamoPendiente>(arrData);
  selection = new SelectionModel<ReclamoPendiente>(true, []);

  ngOnInit() {
      this.objIDArServ = {
        usu_IDAreaServicio: this.user.usu_IDAreaServicio
      };

this.ordServService.selectReclamosPendientes(this.objIDArServ).subscribe(data => 
 {
    arrData = data;
    console.log(data);
 });
}

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

  masterToggle() {
    this.isAllSelected()
      ? this.selection.clear()
      : this.dataSource.data.forEach(row => this.selection.select(row));
  }

  checkboxLabel(row?: any): string {
    if (!row) {
      return `${this.isAllSelected() ? 'select' : 'deselect'} all`;
    }
    return `${
      this.selection.isSelected(row) ? 'deselect' : 'select'
    } row ${row.position + 1}`;
  }
}

控制台结果:

屏幕:

有什么想法吗?

【问题讨论】:

    标签: angular angular-material angular-material-table


    【解决方案1】:

    这是因为您甚至在从服务加载数据之前就尝试将数据分配给表。

    试试类似的东西

     dataSource :any
    ngOnInit(){
    
    this.ordServService.selectReclamosPendientes(this.objIDArServ).subscribe(data => 
     {
        arrData = data;
        console.log(data);
    this.dataSource=new MatTableDataSource(arrData);
     });
    }
    

    希望对你有帮助

    【讨论】:

    • 我已经尝试过这种方法,但它不起作用。它显示以下错误:ERROR TypeError: Cannot read property 'hasValue' of undefined
    • @AguFortini 可以把代码分享到stackblitz上,这样调试起来会很方便
    【解决方案2】:

    您的主要问题是您没有将数据正确传递给您的dataSource

    您从哪里获取数据 - 试试这个:

    arrData = data;
    console.log(data);
    this.dataSource.data = data;
    

    arrData = data;
    console.log(data);
    this.dataSource = new MatTableDataSource<ReclamoPendiente>(data);
    

    【讨论】:

    • 另外,如果您要更新数据,您可能希望将arrData 声明为CrearOrdenServicioComponent 类的属性。
    • 嗨,约翰!如果我尝试过这种方式,但它向我显示错误:错误类型错误:无法读取未定义的属性“hasValue”。 (html中的第4行)
    • 是的,但是在角度材料的页面中,代码是这样指定的。 Https://material.angular.io/components/table/examples表12
    • 只是为了看看你是否得到任何数据,完全删除第一个mat-checkbox元素。您的表格中是否填充了数据?
    • 表格是通过在 C# 中调用我的 WebApi 中的 get 方法来填充的,我发送一个 JSON 并获得一个 JSON 作为响应..我删除了 mat-checkbox,错误不再出现,但是数据不显示
    猜你喜欢
    • 2017-05-13
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2015-11-13
    • 2022-01-01
    相关资源
    最近更新 更多