You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Angular的ngModel中绑定动态嵌套键?(PrimeNG场景)

解决Angular PrimeNG表格动态嵌套键的ngModel绑定问题

你的问题在于rowData[col.field]无法解析variables.code这种嵌套路径——它会把整个字符串当作单个属性名去查找,而非逐层访问嵌套对象。下面是两种可行的实现方式:

方法一:使用自定义管道

创建一个支持读写操作的管道,适配ngModel的双向绑定需求:

1. 编写嵌套属性管道

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'nestedProperty' })
export class NestedPropertyPipe implements PipeTransform {
  transform(obj: any, path: string, value?: any): any {
    const keys = path.split('.');
    let current = obj;

    // 处理ngModel的赋值操作
    if (value !== undefined) {
      for (let i = 0; i < keys.length - 1; i++) {
        if (!current[keys[i]]) current[keys[i]] = {};
        current = current[keys[i]];
      }
      current[keys[keys.length - 1]] = value;
      return obj;
    }

    // 处理ngModel的取值操作
    for (const key of keys) {
      if (!current) return undefined;
      current = current[key];
    }
    return current;
  }
}

2. 注册管道

将这个管道添加到你的Angular模块的declarations数组中,确保模板可以调用它。

3. 修改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 | nestedProperty:col.field"/>
      </td>
    </tr>
  </ng-template>
</p-table>

方法二:使用组件内工具函数

如果不想创建管道,可以在组件内实现读写嵌套属性的方法:

1. 组件内添加工具方法

// 获取嵌套属性值
getNestedValue(obj: any, path: string): any {
  return path.split('.').reduce((current, key) => current?.[key], obj);
}

// 设置嵌套属性值
setNestedValue(obj: any, path: string, value: any): void {
  const keys = path.split('.');
  let current = obj;
  for (let i = 0; i < keys.length - 1; i++) {
    if (!current[keys[i]]) current[keys[i]] = {};
    current = current[keys[i]];
  }
  current[keys[keys.length - 1]] = value;
}

2. 修改HTML模板

通过[ngModel]和(ngModelChange)手动实现双向绑定:

<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]="getNestedValue(rowData, col.field)"
          (ngModelChange)="setNestedValue(rowData, col.field, $event)"/>
      </td>
    </tr>
  </ng-template>
</p-table>

两种方法都能解决你的问题:管道方式更通用,适合多组件复用;工具函数方式更轻量,适合单个组件内使用。

内容的提问来源于stack exchange,提问作者Mitinoh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:54:18