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 に答える