首页 > 解决方案 > 角度材料文本框在垫表中的页面更改上失去价值

问题描述

我有一个 Angular Material 表,我在其中填充数据。我有一个输入框作为表中的列之一,用于接受用户的值。表是这样的——

初始表外观

由于记录可以更多,所以我也使用 mat-paginator 进行分页。我面临的问题是 - 当我在文本框中输入一个值(如上面屏幕截图中的 12 或 10)然后更改页面并返回到初始页面时,已经输入的值从所有文本中丢失框(#screenshot 2 & 3)。

换页

返回初始页面 即使在页面更改后,如何在文本框中保留已输入的值?

HTML 模板

<div class="mat-elevation-z8">
  <table mat-table [dataSource]="dataSource" style="width: 100%">
    <!-- Position Column -->
    <ng-container matColumnDef="position">
      <th mat-header-cell *matHeaderCellDef>No.</th>
      <td mat-cell *matCellDef="let element">{{ element.position }}</td>
    </ng-container>

    <!-- Name Column -->
    <ng-container matColumnDef="name">
      <th mat-header-cell *matHeaderCellDef>Name</th>
      <td mat-cell *matCellDef="let element">{{ element.name }}</td>
    </ng-container>

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

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

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

        <input
          type="number"
          matInput
          placeholder="Enter qty.."
          min="1"
          (change)="valueInput($event, element)"
          [value]="element.value"
        />
      </td>
    </ng-container>

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

  <mat-paginator
    [pageSizeOptions]="[5, 10, 20]"
    showFirstLastButtons
  ></mat-paginator>
</div>

打字稿 -

import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';
import { MatTableDataSource } from '@angular/material';
import { MatPaginator } from '@angular/material/paginator';

@Component({
  selector: 'app-test',
  templateUrl: './test.component.html',
  styleUrls: ['./test.component.scss']
})
export class TestComponent implements OnInit, AfterViewInit {

  displayedColumns: string[] = ['position', 'name', 'weight', 'symbol', 'value'];
  dataSource = new MatTableDataSource<PeriodicElement>(ELEMENT_DATA);

  @ViewChild(MatPaginator) paginator: MatPaginator;

  ngAfterViewInit() {
    this.dataSource.paginator = this.paginator;
  }
}
export interface PeriodicElement {
  name: string;
  position: number;
  weight: number;
  symbol: string;
  value: string;
}
const ELEMENT_DATA: PeriodicElement[] = [
  { position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H', value: '' },
  { position: 2, name: 'Helium', weight: 4.0026, symbol: 'He', value: '' },
  { position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li', value: '' },
  { position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be', value: '' },
  { position: 5, name: 'Boron', weight: 10.811, symbol: 'B', value: '' },
  { position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C', value: '' },
  { position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N', value: '' },
  { position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O', value: '' },
  { position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F', value: '' },
  { position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne', value: '' },
  { position: 11, name: 'Sodium', weight: 22.9897, symbol: 'Na', value: '' },
  { position: 12, name: 'Magnesium', weight: 24.305, symbol: 'Mg', value: '' },
  { position: 13, name: 'Aluminum', weight: 26.9815, symbol: 'Al', value: '' },
  { position: 14, name: 'Silicon', weight: 28.0855, symbol: 'Si', value: '' },
  { position: 15, name: 'Phosphorus', weight: 30.9738, symbol: 'P', value: '' },
  { position: 16, name: 'Sulfur', weight: 32.065, symbol: 'S', value: '' },
  { position: 17, name: 'Chlorine', weight: 35.453, symbol: 'Cl', value: '' },
  { position: 18, name: 'Argon', weight: 39.948, symbol: 'Ar', value: '' },
  { position: 19, name: 'Potassium', weight: 39.0983, symbol: 'K', value: '' },
  { position: 20, name: 'Calcium', weight: 40.078, symbol: 'Ca', value: '' },
];

标签: javascriptangularangular-materialangular8

解决方案


当您[value]="element.value"在输入上使用时,它不会将输入值绑定到元素,它会做相反的事情。因此输入的值不受元素值属性的影响,并且当您更改页面时,输入的状态会丢失。

要将状态保存到您可以使用的元素属性[(ngModel)]="element.value",您还应该删除 {{ element.value }} 否则它将首先在 {{ element.value }} 中显示两次值,然后在输入中显示第二次

<ng-container matColumnDef="value">
    <th mat-header-cell *matHeaderCellDef>Value</th>
    <td mat-cell *matCellDef="let element">
        <input
                type="number"
                matInput
                placeholder="Enter qty.."
                min="1"
                [(ngModel)]="element.value"
                (change)="valueInput($event, element)"
        />
    </td>
</ng-container>

推荐阅读