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

时间:2014-07-18 13:30:09

标签: javascript angularjs validation

参考这个插件: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。在后续事件中,事件触发前它是错误的。但是,当我在视图中打印{{form['myfield'].$valid}}时,无论如何都会true

我想这可能是一个时间问题,在指令运行setValidity(false)时,视图已经检查过了。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

将您的代码包裹在$ 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);
        });
      });
    }
  };
});