如果您不想使用 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;
}
}
}
}
};
});