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

AngularJS中如何动态递增ngModel字段名称?

解决AngularJS动态生成文本框的ng-model命名问题

我来帮你搞定这个需求!其实有两种思路可以实现,一种是严格按照你想要的「给每个ng-model设置带序号的属性名」,另一种是更符合AngularJS最佳实践的方式,我都给你列出来:

方案一:动态生成带序号的ng-model属性名

这种方式会让每个文本框的ng-model绑定到column.product_cgst-1、column.product_cgst-2这类带序号的属性上,具体实现如下:

1. 控制器代码

首先在你的AngularJS控制器里,初始化columns数组并实现添加/删除产品的方法:

angular.module('yourAppName', [])
.controller('yourControllerName', function($scope) {
  // 初始化产品数组
  $scope.columns = [];

  // 添加产品按钮点击事件
  $scope.addProduct = function() {
    // 往数组里推入一个空对象,后续会动态添加带序号的属性
    $scope.columns.push({});
  };

  // 可选:删除产品的方法
  $scope.removeProduct = function(index) {
    $scope.columns.splice(index, 1);
  };
});

2. 模板代码

在HTML模板里,利用ng-repeat的$index(循环索引)来动态生成属性名和input的name属性:

<form ng-controller="yourControllerName">
  <!-- 循环渲染每个产品的输入框 -->
  <div ng-repeat="column in columns track by $index" style="margin-bottom: 10px;">
    <div class="form-group">
      <input 
        type="text" 
        name="product_name-{{$index + 1}}" 
        ng-model="column.product_name" 
        required 
        placeholder="Product Name" 
        class="form-control"
      >
    </div>
    <div class="form-group">
      <!-- 核心:用$index+1生成从1开始的序号,绑定到动态属性上 -->
      <input 
        type="text" 
        name="product_cgst-{{$index + 1}}" 
        ng-model="column['product_cgst-' + ($index + 1)]" 
        placeholder="Product CGST" 
        class="form-control"
      >
    </div>
    <!-- 可选的删除按钮 -->
    <button type="button" ng-click="removeProduct($index)" class="btn btn-danger">删除产品</button>
  </div>

  <!-- 添加产品按钮 -->
  <button type="button" ng-click="addProduct()" class="btn btn-primary">添加产品</button>
</form>

这里的关键是用column['product_cgst-' + ($index + 1)]来动态访问对象属性,AngularJS支持这种方括号语法的动态属性绑定。

方案二:更简洁的最佳实践方式

其实你可能不需要修改ng-model的属性名,因为ng-repeat循环的每个column都是数组里的独立对象,它们的product_cgst属性本来就是相互独立的。这种方式代码更清晰,维护起来也更简单:

1. 控制器代码(和方案一基本一致)

angular.module('yourAppName', [])
.controller('yourControllerName', function($scope) {
  $scope.columns = [];

  $scope.addProduct = function() {
    // 推入一个包含默认属性的对象,也可以是空对象
    $scope.columns.push({ product_name: '', product_cgst: '' });
  };

  $scope.removeProduct = function(index) {
    $scope.columns.splice(index, 1);
  };
});

2. 模板代码

<form ng-controller="yourControllerName">
  <div ng-repeat="column in columns track by $index" style="margin-bottom: 10px;">
    <div class="form-group">
      <input 
        type="text" 
        name="product_name-{{$index + 1}}" 
        ng-model="column.product_name" 
        required 
        placeholder="Product Name" 
        class="form-control"
      >
    </div>
    <div class="form-group">
      <!-- 直接绑定统一的product_cgst属性,每个column的这个属性都是独立的 -->
      <input 
        type="text" 
        name="product_cgst-{{$index + 1}}" 
        ng-model="column.product_cgst" 
        placeholder="Product CGST" 
        class="form-control"
      >
    </div>
    <button type="button" ng-click="removeProduct($index)" class="btn btn-danger">删除产品</button>
  </div>

  <button type="button" ng-click="addProduct()" class="btn btn-primary">添加产品</button>
</form>

这种方案下,每个产品的CGST值都会存在对应column对象的product_cgst属性里,完全不会互相干扰,而且代码更简洁易读,推荐优先使用这种方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:37:29