当我$编译包含指令的元素时,我看到指令的行为不一致。在我的情况下,我有一个指令来验证密码是否与另一个密码字段匹配。该指令看起来像这样:AngularJS:用另一个指令编译元素会改变行为
app.directive('passwordMatches', function() {
return {
require: 'ngModel',
restrict: 'A',
scope: {
otherPasswordFieldValue: '=passwordMatches'
},
link: function (scope, elem, attrs, ngModelController) {
function validate(value) {
return value === scope.otherPasswordFieldValue;
}
//For DOM -> model validation
ngModelController.$parsers.unshift(function (value) {
var valid = validate(value);
ngModelController.$setValidity('password-matches', valid);
return valid ? value : undefined;
});
//For model -> DOM validation
ngModelController.$formatters.unshift(function (value) {
ngModelController.$setValidity('password-matches', validate(value));
return value;
});
scope.$watch(function() { return scope.otherPasswordFieldValue }, function() {
var valid = validate(ngModelController.$viewValue);
ngModelController.$setValidity('password-matches', valid);
});
}
};
});
这个工作很好。但我有另一个指令,经常在同一个元素上使用。该指令的细节并不重要,因为我已经证明问题的根源在于第二个指令编译元素。只要我添加这个指令,行为就会改变。没有编译元素,我的passwordMatches指令工作正常(如果我输入的内容与其他字段不匹配,并且我可以输入任何我想要的内容,则该字段将变为无效)。
但只要我编译元素,我可以键入我想要的东西,直到我使字段匹配,并且它的行为正常,直到那一点。但是,一旦两个字段中的值匹配,如果输入任何内容以使它们不匹配,则该字段将完全消失。最简单的方法是在这个jsbin中:http://jsbin.com/IkuMECEf/12/edit。要重现,请在第一个字段中输入“foo”,然后尝试在第二个字段中输入“fooo”(三个)。只要你输入第三个“o”字段就会被删除。如果你注释掉$ compile,它可以正常工作。
谢谢!
什么是在第二个指令'$ compile'的目的是什么?目前只在'input'上运行,没有看到任何需要在demo中编译的东西 – charlietfl
是的,我不想让这些细节复杂化演示。这是另一个向元素添加验证相关ng-class的指令。我需要一个指令来执行此操作,因为ng类内容是基于正在执行的验证类型而动态的。由于它添加了一个角度指令,它需要再次编译该元素。 –
也许可以使用返回类的函数? '纳克级= “vaildationClass()”'。 – charlietfl