【发布时间】:2014-01-20 06:58:01
【问题描述】:
我希望字段的标签与字段验证属性进行一些交互。 我创建了一个工作示例的 plunker。
http://plnkr.co/edit/oNq5lmjtjRDaEkzKsrR2?p=preview
但在本例中,字段名是硬编码的。
我尝试通过范围变量将字段名设置到模板中。这不起作用:
http://plnkr.co/edit/yEl04xyFR5RWYCmI2bMH?p=preview
HTML:
<form name="myForm" ng-controller="ctrl">
<fieldset field-name="{{model.fieldName}}" label-text="{{model.label}}" ng-model="model.value">
<fieldset>
</form>
JavaScript:
var app = angular.module('myApp',[]);
app.directive('fieldset', function(){
return {
template: '<label ng-class="{invalid:$parent.myForm[{{fieldName}}].$invalid}">{{lbl}}</label>: ' +
'<input name="{{fieldName}}" ng-model="value" required>',
restrict : 'E',
scope : {
value : '=ngModel',
lbl : '@labelText',
fieldName : '@'
},
link : function(scope, elem, attrs) {
console.log(scope.$parent.myForm);
}
}
})
app.controller('ctrl', function($scope) {
$scope.model = {
fieldName : 'myField',
label : 'Label for Field',
value : 6
}
});
scope.$parent.myForm 中的字段名是“{{fieldName}}”而不是“myField”。但是在 DOM 中,字段名是按预期分配的。 我该如何解决这个问题?
【问题讨论】:
-
遗憾的是,如果你想使用 ng-form,
name属性不能动态设置,这是因为在插入name属性中的表达式之前链接了 ng-form 指令。你打算在 ng-repeat 中使用你的fieldset指令吗?如果没有,那么您只需将name设置为“arbitraryDummyString”,您的表单验证就会起作用。 -
不幸的是,它与数据库字段一起使用,通常与 ng-repeat 一起使用。没有办法在指令中添加带有绑定的属性吗?在这种情况下,我可以先使用一个 dummyName,然后在我的链接功能中将绑定添加到真实名称并在链接功能中创建关联的键,如下所示:
link : function(scope, elem, attrs) { var form = scope.$parent.myForm; var name = scope.fieldName; form[name] = form.dummyName; form[name].$name = name; delete form.dummyName; elem.find('input').attr('name',name); }
标签: angularjs angularjs-directive