Angularjs 当我使用ngModel时,为什么错误没有转化为模型。$setValidity?
我对嵌套指令和将错误转换为模型有问题 这是准确的样品 指令('myTestValidation'[ 函数(){ 返回{ 限制:“A”, 要求:'ngModel', 链接:功能(范围、元素、属性、模型){ log('my-test-validation链接'); ngModel.$parsers.unshift(函数(viewValue){ //为什么会丢失错误(请参见结果窗口)? log('myTestError to false'); ngModel.$setValidity('myTestError',false); 返回视图值; }); } }; } ]) .指令('myDatepicker'[ 函数(){ 返回{ 限制:“A”, 要求:'ngModel', 编译:函数(元素、范围){ log('my-datepicker compile'); 元素removeAttr('my-datepicker'); 元素。包裹(“”); 元素attr('my-test-validation',''); } }; } ]);Angularjs 当我使用ngModel时,为什么错误没有转化为模型。$setValidity?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我对嵌套指令和将错误转换为模型有问题 这是准确的样品 指令('myTestValidation'[ 函数(){ 返回{ 限制:“A”, 要求:'ngModel', 链接:功能(范围、元素、属性、模型){ log('my-test-validation链接'); ngModel.$parsers.unshift(函数(viewValue){ //为什么会丢失错误(请参见结果窗口)? log('myTestError to false'); ngModel.$setValidity('myTestE
Angular在元素中收集指令(我们称之为“指令发现”阶段),然后调用编译函数;
myDatepicker
的编译函数添加了一个属性,如果该属性在流程开始时出现,将被解释为一个指令。但是这个元素的“指令发现”阶段已经结束,属性只是一个属性
然而,在您的情况下,很容易通过以下方式之一补救这种情况:
myDatepicker
可以包含myTestValidation
的功能。最简单的情况是,如果未单独使用myTestValidation
,则使用此选项myTestValidation
的功能将导出到一个服务中,myTestValidation
和myDatepicker
都依赖于此服务。这更复杂,但没有代码重复o、 。。谢谢,尼科斯,你给我指出了正确的方法,第一条建议非常有用。我用这种方式解决了这个问题:
.directive('myDatepicker', [
function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
console.log('my-test-validation link');
element.removeAttr('my-datepicker');
element.wrap('<div class="input-append"></div>');
ngModel.$parsers.unshift(function (viewValue) {
// cool!! the error has not been lost
console.log('myTestError to false');
ngModel.$setValidity('myTestError', true);
return viewValue;
});
}
};
}
]);
指令('myDatepicker'[
函数(){
返回{
限制:“A”,
要求:'ngModel',
链接:功能(范围、元素、属性、模型){
log('my-test-validation链接');
元素removeAttr('my-datepicker');
元素。包裹(“”);
ngModel.$parsers.unshift(函数(viewValue){
//酷!!错误没有丢失
log('myTestError to false');
ngModel.$setValidity('myTestError',true);
返回视图值;
});
}
};
}
]);
但非常奇怪的是,上面的代码在angular版本1.1.1中起作用,而在下一个版本1.2.1中不起作用。也许有什么东西被破坏了?
.directive('myDatepicker', [
function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
console.log('my-test-validation link');
element.removeAttr('my-datepicker');
element.wrap('<div class="input-append"></div>');
ngModel.$parsers.unshift(function (viewValue) {
// cool!! the error has not been lost
console.log('myTestError to false');
ngModel.$setValidity('myTestError', true);
return viewValue;
});
}
};
}
]);