Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 当我使用ngModel时,为什么错误没有转化为模型。$setValidity?_Angularjs_Angularjs Directive - Fatal编程技术网

Angularjs 当我使用ngModel时,为什么错误没有转化为模型。$setValidity?

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

我对嵌套指令和将错误转换为模型有问题

这是准确的样品

指令('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',''); } }; } ]);
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;
                    });
    
                }
            };
        }
    ]);