如何在ngModel中使用动态键?

这是html模板

<p-table [columns]="cols" [value]="data">
  <ng-template pTemplate="body" let-rowData let-columns="columns">
    <tr>
      <td *ngFor="let col of columns">
        <input type="text" pInputText [(ngModel)]="rowData[col.field]"/>
      </td>
    </tr>
  </ng-template>
</p-table>

这是"cols"变量

cols = [
      { field: 'variables.code', header: 'Code' },
      { field: 'variables.name', header: 'Name' },
];

这是一个数据示例

[{
  "variables": {
     "code": "D44D5",
     "name": "keyboard"
  }
}]

推荐答案

你可以做下面这样的事情,你可以拆分col.field.split('.') as fieldName,然后形成ngModel,像这样rowData[fieldName[0]][fieldName[1]].

<div *ngFor="let rowData of rows;">
  <div *ngFor="let col of columns;">
    <ng-container *ngIf="getValue(rowData, col.field) as fieldName">
      <input type="text" [(ngModel)]="fieldName" />
    </ng-container>
  </div>
</div>

TS

getValue(rowData, fieldPath) {
    const fieldName = fieldPath
      .replace(/[\[\]']+/g,'.')
      .split('.')
      .filter(i => i);
    console.log(fieldName);
    const field = fieldName.reduce((acc, f) => acc[f], rowData)
    return field;
}

Stackblitz

注:当对象具有嵌套 struct 时,上述两种用例都适用.

Typescript相关问答推荐

Typescript自定义键映射

TypeScript类型不匹配:在返回类型中处理已经声明的Promise Wrapper

我应该使用什么类型的React表单onsubmit事件?

Webpack说你可能需要在Reactjs项目中增加一个加载器''

TypeScrip:基于参数的条件返回类型

如何在TypeScrip中使用嵌套对象中的类型映射?

用于验证字符串变量的接口成员

分解对象时出现打字错误

ANGLING v17 CLI默认设置为独立:延迟加载是否仍需要@NgModule进行路由?

如何在ANGLE中注册自定义验证器

如何编写在返回函数上分配了属性的类型安全泛型闭包

APP_INITIALIZER在继续到其他Provider 之前未解析promise

为什么我在这个重载函数中需要`as any`?

为什么发送空字段?

如何在不违反挂钩规则的情况下动态更改显示内容(带有状态)?

如果判断空值,则基本类型Gaurd不起作用

在TS泛型和记录类型映射方面有问题

如何在TypeScript中声明逆变函数成员?

当受其他参数限制时,通用参数类型不会缩小

是否有可能不允许在 TypeScript 中设置类属性,但也会抛出运行时错误?