最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Single Checkbox in Mat-Table in Angular Strange Behavior - Stack Overflow

programmeradmin4浏览0评论

Situation: I have a table with a [dataSource]="dataComision" form that has a text input where a percentage is entered. Within the table, we have a checkbox, and when checked, all records in the table should be automatically checked and the percentage value copied. Currently, it does this correctly. However, if I uncheck all of them, 0 should be added to the table's text boxes, and it does this correctly. However, if I check only one, only the entered percentage should be added to the checked one. Currently, the percentage is added to all of them.

Codigo de la vista:

<table mat-table [dataSource]="dataComision">
...
<ng-container matColumnDef="CONF">
                        <th mat-header-cell *matHeaderCellDef class="centered-cell two-row-header">
                            <div class="header-content">APLICA CONFIGURACION</div>
                            <div class="checkbox-container">
                                <mat-checkbox (change)="toggleSelectAll($event)" 
                                              [checked]="isAllSelected()"
                                              [indeterminate]="isSomeSelected()"></mat-checkbox>
                                <span>Todos</span>
                            </div>
                        </th>
                        <td mat-cell *matCellDef="let element; let i = index" class="centered-cell">
                            <mat-checkbox formControlName="aplicaConf"
                                          (change)="cargaPorcentaje($event, i)" 
                                          [(ngModel)]="element.CONF">
                            </mat-checkbox>
                        </td>
                    </ng-container>
                      
                    <ng-container matColumnDef="PORCENTAJE">
                        <th mat-header-cell *matHeaderCellDef class="centered-cell">Nuevo Porcentaje </th>
                        <td mat-cell *matCellDef="let element let i = index" class="centered-cell">
                            <input type="text" matInput formControlName="porcentaje" [(ngModel)]="element.PORCENTAJE">
                        </td>
                    </ng-container>

at component:

isAllSelected() {
    return this.dataComision.data.length > 0 && this.dataComision.data.every(item => item.CONF);
  }

  isSomeSelected() {
    return this.dataComision.data.some(item => item.CONF) && !this.isAllSelected();
  }

  toggleSelectAll(event: any) {
    const porcentajeAgente = thisisionFormGroup.get('porcentajeAgente')?.value || '0';


    this.dataComision.data = this.dataComision.data.map(item => ({
      ...item,
      CONF: event.checked,
      PORCENTAJE_ORIGINAL: event.checked ? item.PORCENTAJE_ORIGINAL || porcentajeAgente : item.PORCENTAJE, // Guardar original
      PORCENTAJE: event.checked ? porcentajeAgente : '0' // Asignar nuevo valor o resetear a 0
    }));
  
  }

onTab(event: KeyboardEvent){
    if (event.key === 'Tab') {
      const porcentajeAgente = thisisionFormGroup.get('porcentajeAgente')?.value || '0';
      const newData = this.dataComision.data.map(item => ({
        ...item,
        CONF: true,
        PORCENTAJE: porcentajeAgente
      }));
      this.dataComision.data = newData;
    }
    
  }

cargaPorcentaje(event: MatCheckboxChange, index: number) {
    const porcentajeAgente = thisisionFormGroup.get('porcentajeAgente')?.value || '0';

    if (event.checked) {
      this.dataComision.data[index].PORCENTAJE = this.dataComision.data[index].PORCENTAJE_ORIGINAL || porcentajeAgente;
    } else {
      this.dataComision.data[index].PORCENTAJE_ORIGINAL = this.dataComision.data[index].PORCENTAJE;
      this.dataComision.data[index].PORCENTAJE = '0';
    }

    
  }

How fix the code, for the best results, for work. Thanks

try this:

// Clonar la data asegurando el tipo correcto
    const newData = JSON.parse(JSON.stringify(this.dataComision.data));

  newData.forEach((item: { CONF: boolean; PORCENTAJE_ORIGINAL: string; PORCENTAJE: string; }) => {
    //item.CONF = event.checked;
    item.PORCENTAJE_ORIGINAL = event.checked ? item.PORCENTAJE_ORIGINAL || porcentajeAgente : item.PORCENTAJE;
    item.PORCENTAJE = event.checked ? porcentajeAgente : '0';
  });

    // Forzar actualización de Angular
    this.dataComision.data = [];
    this.dataComision = new MatTableDataSource(newData);
    this.dataComision._updateChangeSubscription();

but not works

发布评论

评论列表(0)

  1. 暂无评论