0

次のように角度を使用してフォーム検証システムをセットアップしようとしています。

フィールドが $invalid && $dirty の両方である場合、エラー クラスが割り当てられます。

これは、個々のフィールドに最適です。以下はフィールドの例です。

<div class="control-group" ng-class="getErrorClasses(schoolSignup.first_name)">
      <label class="control-label" for="first_name">First Name</label>
       <div class="controls">
            <input type="text" class="input-xlarge" id="first_name" name="first_name" required ng-maxlength="30" ng-model="school.first_name">
            <span class="help-inline" ng-show="showError(schoolSignup.first_name, 'required')">This field is required</span>
            <span class="help-inline" ng-show="showError(schoolSignup.first_name, 'maxlength')">Maximum of 30 character allowed</span>
        </div>
   </div>

schoolSignupフォームの名前です。

ng-class="getErrorClasses(schoolSignup.first_name)">コントローラで次のように定義されています

$scope.getErrorClasses = function(ngModelContoller) {
        return {
            error: ngModelContoller.$invalid && ngModelContoller.$dirty
        };
    };

また、エラーのヘルプ項目ng-show="showError(schoolSignup.first_name, 'required')"は次のように定義されています。

$scope.showError = function(ngModelController, error) {
      return ngModelController.$dirty && ngModelController.$error[error];
  };

これはすべてうまくいきます。

ただし、ユーザーが送信ボタンをクリックし、必要な個々のフィールドがすべて無効な場合required、適切なフィールドの横にエラーメッセージを表示するようにします。

これには、このシステムに基づいて、すべての個々のフィールド$dirty$error['required']値をに設定する必要があります。true

can-saveフォームにアクセスできる次のように送信ボタンにディレクティブを設定しました。

<button class="btn btn-primary btn-large" type="submit" can-save="schoolSignup">Register</button>

-

.directive('canSave', function () {
    return function (scope, element, attrs) {

        var form = scope.$eval(attrs.canSave);

        var valid = false;

        element.click(function(){
            if(!valid)
            {
                // show errors

                return false;
            }

            return true;
        });

        scope.$watch(function() {
            return form.$dirty && form.$valid;
        }, function(value) {
            valid = !!value;
        });
    }

});

エラーを希望どおりに表示することを除いて、これはすべて機能します。

これを達成する方法についてのアイデアをいただければ幸いです。

4

1 に答える 1

2

興味のある人のために、エラーをループし、それぞれをに設定してから$dirty実行するようにディレクティブを修正しました$rootScope.$digest()

.directive('canSave', function ($rootScope) {
    return function (scope, element, attrs) {

        var form = scope.$eval(attrs.canSave);

        element.click(function () {
            if(form.$dirty && form.$valid) {
                return true;
            } else {
                // show errors
                angular.forEach(form.$error, function (value, key) {
                    var type = form.$error[key];

                    angular.forEach(type, function (item) {
                        item.$dirty = true;
                        item.$pristine = false;
                    });
                });

                $rootScope.$digest();

                return false;
            }
        });
    }
});
于 2013-09-13T04:27:24.887 に答える