Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.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
Javascript 指令在字段上调用setValidity(false),但字段有效性不会根据视图而改变_Javascript_Angularjs_Validation - Fatal编程技术网

Javascript 指令在字段上调用setValidity(false),但字段有效性不会根据视图而改变

Javascript 指令在字段上调用setValidity(false),但字段有效性不会根据视图而改变,javascript,angularjs,validation,Javascript,Angularjs,Validation,关于本文件: 我有一个指令,它运行一个测试,然后调用$scope.form['myfield'].setValidity(),并给出结果。但是,这不会反映在视图或控制器中 始终将设置为false的简单示例: app.directive('myDirective', function() { return { link: function(scope, elem, attrs) { elem.on('blur change', function() { co

关于本文件:

我有一个指令,它运行一个测试,然后调用
$scope.form['myfield'].setValidity()
,并给出结果。但是,这不会反映在视图或控制器中

始终将
设置为false
的简单示例:

app.directive('myDirective', function() {
  return {
    link: function(scope, elem, attrs) {
      elem.on('blur change', function() {
        console.log("start valid:" + scope.form[attrs.name].$valid);
        scope.form[attrs.name].$setValidity('myfield', false);
        console.log("end valid:" + scope.form[attrs.name].$valid);
      });
    }
  };
});
我认为:

<input type="text" ng-model="myModel" name="myfield" my-directive/>

控制台日志记录确认当指令中的事件首次激发时,字段有效,然后在setValidity之后变为false。在随后的事件中,在事件激发之前为false。但是,当我在视图中打印出
{form['myfield'].$valid}}
时,它仍然保持
true


我想这可能是一个计时问题,当指令中运行
setValidity(false)
时,视图已经检查过了。如何修复此问题?

将代码包装在$apply中以触发摘要:

app.directive('myDirective', function() {
  return {
    link: function(scope, elem, attrs) {
      elem.on('blur change', function() {
        console.log("start valid:" + scope.form[attrs.name].$valid);
        scope.$apply(function() {
            scope.form[attrs.name].$setValidity('myfield', false);
            console.log("end valid:" + scope.form[attrs.name].$valid);
        });
      });
    }
  };
});

很酷,以前没有听说过$digest/$apply,但本文简单地解释了:是的,angular不知道的任何代码(如jquery blur/change事件),$apply都需要手动触发摘要周期。