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

AngularJS中如何获取ng-repeat表格td内ng-model的绑定值

问题分析与解决方案

你的问题根源在于ng-repeat会创建独立的子作用域,你把pay、insure、cash直接绑定为子作用域变量,而非绑定到ng-repeat循环的每个s对象上。这些变量仅存在于每个<tr>对应的子作用域中,无法通过$scope直接访问,且多行的输入值会互相覆盖,最终导致打印时出现undefined。

修复步骤:

1. 修改HTML模板,将输入框绑定到循环对象的属性上

把每个输入框的ng-model改为s.pay、s.insure、s.cash,确保每个子服务的修改值都存储在自身对象中;同时修正ng-selected的写法(Angular指令内无需用{{}}包裹表达式):

<table class="table table-bordered table-condensed">
  <thead>
    <tr>
      <th style="text-align: center;">
        <input type="checkbox" />
      </th>
      <th style="width: 60%;">
        Sub Service
      </th>
      <th>
        Payment
      </th>
      <th>
        Insure
      </th>
      <th>
        Cash
      </th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="s in subServices">
      <td style="text-align: center;">
        <input type="checkbox" ng-model="s.details" />
      </td>
      <td>
        {{s.SUBSERVNAME_L}}
      </td>
      <td>
        <select ng-model="s.pay">
          <option value="0">Choose</option>
          <option ng-repeat="p in payTypes" value="{{p.payid}}" ng-selected="p.payid == s.pay">{{p.paynm}}</option>
        </select>
      </td>
      <td>
        <input class="form-control input-sm" type="number" ng-model="s.insure" />
      </td>
      <td>
        <input class="form-control input-sm" type="number" ng-model="s.cash" />
      </td>
    </tr>
  </tbody>
</table>

2. 修改JS的save函数,从每个选中的对象中获取值

遍历subServices时,直接从选中的s对象里读取pay、insure、cash属性,而非访问$scope上的全局变量:

$scope.subSrvData = [];
$scope.save = function () {

    $scope.subServices.forEach(function (s) {
        if (s.details == true) {
            console.log(s);
            $scope.subSrvData.push({ 
                Main_Serv: $scope.mainSrv, 
                Sub_Serv: s.SUB_SERV, 
                InsuredAmt: s.insure, 
                CashAmt: s.cash, 
                Perc_Amt: s.pay
            });
        }
    });

    console.log($scope.subSrvData);

    var promisepost = NetRevenueSetupSrv.deleteSubs("NetRevenueSetup/deleteSubs?mainSrv=" + $scope.mainSrv);
    promisepost.then(function (response) {
        var _response = response.data;
        if (_response.Value == -1) {
            toastr['error'](_response.Message);
            return;
        }
        var promisepost = NetRevenueSetupSrv.save("NetRevenueSetup/save", $scope.subSrvData);
        promisepost.then(function (response) {
            var _response = response.data;
            if (_response.Value == -1) {
                toastr['error'](_response.Message);
                return;
            }
            toastr.success("Successfully Saved");
        });
        $scope.subSrvData = [];
    });
};

额外优化建议

对于<select>,推荐使用Angular的ng-options指令替代ng-repeat渲染选项,写法更简洁且符合Angular最佳实践:

<select ng-model="s.pay" ng-options="p.payid as p.paynm for p in payTypes">
  <option value="0">Choose</option>
</select>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:50:22