您正在创建 2 个单独ngModel
的实例,它们都在输入更改时更新。
第一个是由它<input>
自己创建的,它是分配给“myform”的。这也是绑定<span>
里面的错误信息的地方。my-wrapper
第二个是由my-wrapper
指令创建的——它是附加了验证器的那个。
如果您检查控制台(对于下面的 plnkr)并检查输入更改时验证器输出的值,您可以看到ngModel
与验证器ngModel
关联的值与与表单关联的值不同。但是当输入发生变化时,两者实际上都在更新。
页面加载后清除控制台,然后在更改第一个输入时检查输出。
http://plnkr.co/edit/nz6ODOVpn6lJlb055Svs?p=preview
为什么会这样?
因为两个ng-model
指令都传递了相同的字符串('values.abc'),然后根据范围对其进行评估以确定它们应该监视和更新哪个对象属性 - 即双向绑定。
因此,当您更改输入时,您正在scope.values.abc
通过输入ngModel
实例更改 的值。此更改由实例拾取my-wrapper
ngModel
- 因为它正在查看相同的对象属性 - 然后验证自身。
您无法以这种方式解决问题,因为ngModel
指令需要一个字符串,而不是另一个ngModel
实例。
解决方案
您可以将属性从my-wrapper
at input
compile 转移:
app.directive("myWrapper", function(){
var templateFn = function(element, attrs){
return '<div ng-form="myform">'+
'<input type="text" name="myfield"/>'+
'<span>(inside directive) : isDuplicate:{{myform.myfield.$error.isDuplicate}}</span>'
'</div>';
}
return {
restrict :'E',
template : templateFn,
require: 'ngModel',
scope: true,
compile: function(element, attrs) {
var attr;
angular.forEach(element.find('input'), function(elem) {
elem = angular.element(elem)
for(attr in attrs.$attr) {
elem.attr(attrs.$attr[attr], attrs[attr]);
}
});
for(attr in attrs.$attr) {
element.removeAttr(attrs.$attr[attr]);
}
}
}
});
http://plnkr.co/edit/m2TV4BZKuyHz3JuLjHrY?p=preview