AngularJS中的$ setValidity没有更新ctrl。$ error

时间:2014-02-12 17:12:53

标签: javascript forms angularjs validation

我正在向Node发送一个AJAX请求,如果某个字段在MongoDB数据库中不是唯一的,则返回“true”,即找到该字段和值的对象,如果没有找到对象,则返回“false” 。这是路线回调:

exports.check = function(req, res) {
    var query = {};
    query[req.body.field] = req.body.value;
    console.log(query);

    Invoice.findOne(query, function(err, invoice) {
        if (err) {
            res.send(err);
        } else {
            if (invoice) {
                res.send(true);
            } else {
                res.send(false);
            }
        }
    });
};

(旁注:如果对res.send的使用完全不合适,请纠正我,让我知道应该使用什么)

这是Angular指令:

app.directive('ngUnique', ['$http', function ($http) {
    return {
      require: 'ngModel',
      scope: {
        ngModel: '@',
      },
      link: function (scope, elem, attrs, ctrl) {
        elem.on('blur', function () {
          scope.$apply(function () {
            var val = elem.val();

            var data = {
              'field': scope.ngModel,
              'value': val
            };

            $http.post('/invoices/check', data).then(function(res) {
              console.log(res.data);
              console.log(ctrl.$error);
              ctrl.$setValidity('exists', res.data);
              console.log(res.data);
              console.log(ctrl.$error);
            });
          });
        });
      }
    };
  }
]);

控制台日志输出很奇怪(这是我输入以前使用的值时,即res.data应为true):

true  // res.data before ctrl.$setValidity
Object {}  // ctrl.$error before ctrl.$setValidity
true  // res.data again
Object {exists: false}  // ctrl.$error after ctrl.$setValidity('exists', res.data)

我无法理解为什么会这样。我一开始以为$ setValidity根本没有执行,但日志显示不然。那么,为什么它设定了不同的价值呢?我错过了什么吗?这是范围问题吗?

1 个答案:

答案 0 :(得分:1)

$ error对象存储传递给$ setValidity的isValid参数的反转。调用$ setValidity时,传入的值为true。然后$ error对象将该值的值存储为该键,以指示没有错误。

https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L1638