如果您不想使用 ng-form,您可以使用自定义指令来更改表单的名称属性。将此指令作为属性放在与 ng-model 相同的元素上。
如果您结合使用其他指令,请注意它们没有设置“终端”属性,否则此函数将无法运行(假设它的优先级为 -1)。
例如,当将此指令与 ng-options 一起使用时,您必须运行这一行monkeypatch:https :
 //github.com/AlJohri/bower-angular/commit/eb17a967b7973eb7fc1124b024aa8b3ca540a155
angular.module('app').directive('fieldNameHack', function() {
    return {
      restrict: 'A',
      priority: -1,
      require: ['ngModel'],
      // the ngModelDirective has a priority of 0.
      // priority is run in reverse order for postLink functions.
      link: function (scope, iElement, iAttrs, ctrls) {
        var name = iElement[0].name;
        name = name.replace(/\{\{\$index\}\}/g, scope.$index);
        var modelCtrl = ctrls[0];
        modelCtrl.$name = name;
      }
    };
});
我经常发现使用 ng-init 将 $index 设置为变量名很有用。例如:
<fieldset class='inputs' ng-repeat="question questions" ng-init="qIndex = $index">
这会将您的正则表达式更改为:
name = name.replace(/\{\{qIndex\}\}/g, scope.qIndex);
如果您有多个嵌套的 ng-repeat,您现在可以使用这些变量名称代替 $parent.$index。
指令的“终端”和“优先级”的定义:https : //docs.angularjs.org/api/ng/service/ $compile#directive-definition-object
Github 关于需要 ng-option monkeypatch 的评论:https
 :
 //github.com/angular/angular.js/commit/9ee2cdff44e7d496774b340de816344126c457b3#commitcomment-6832095 https://twitter.com/aljohri/status/41436
更新:
您也可以使用 ng-form 进行这项工作。
angular.module('app').directive('formNameHack', function() {
    return {
      restrict: 'A',
      priority: 0,
      require: ['form'],
      compile: function() {
        return {
          pre: function(scope, iElement, iAttrs, ctrls) {
            var parentForm = $(iElement).parent().controller('form');
            if (parentForm) {
                var formCtrl = ctrls[0];
                delete parentForm[formCtrl.$name];
                formCtrl.$name = formCtrl.$name.replace(/\{\{\$index\}\}/g, scope.$index);
                parentForm[formCtrl.$name] = formCtrl;
            }
          }
        }
      }
    };
});