关于这个问题:http://plnkr.co/edit/GzC9ufa1WJmKQ6Ad15v9?p=preview

我有一个指令,该指令可以运行测试,然后使用结果调用$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);
        });
      });
    }
  };
});

09-25 18:03
查看更多