2

我有一个指令“ensureUniqueValidator”用于检查数据库中值的唯一性。该功能是通用的。在 HTML 页面中调用它的方式如下:

<input type="email" name="email" ng-model="userCtrl.user.email" 
required ensure-unique-validator />

指令代码:

    app.directive('ensureUniqueValidator', [
        '$http',
        function($http) {
            return {
                restrict : 'A',
                require : 'ngModel',
                link : function(scope, ele, attrs, c) {

                    c.$parsers.push(function(val) {

                        return $http.get(
                                'MainServlet.do?method=is' + attrs.name
                                        + 'unique&' + attrs.name + '='
                                        + val).then(
                                function(result) {
                                    console.log(result.data);
                                    c.$setValidity('ensureUniqueValidator',
                                            result.data);
                                    return result.data;//returns true or false
                                });
                    });
                }
            }
        } ]);

问题是,即使服务器返回 False,表单仍然有效。看起来, $setValidity 函数不会使表单无效。

我在这里做错了吗?提前致谢。

4

1 回答 1

1

这应该可以工作(无论如何,根据文档,我还没有写过其中之一)。

主要的事情似乎是,承诺要么解决一个有效的值,要么拒绝一个无效的值。

// don't forget to inject the $q service
c.$asyncValidators.ensureUniqueValidator = function(modelValue, viewValue) {
    if (ctrl.$isEmpty(modelValue)) {
        // consider empty model valid
        return $q.when();
    }

    var params = {
        method: 'is' + attrs.name + 'unique'
    };
    params[attrs.name] = modelValue;

    return $http.get('MainServlet.do', {
        params: params
    }).then(function(response) {
        if (!response.data) {
            return $q.reject();
        }
        return true;
    });
};
于 2015-04-21T02:13:00.980 回答