15

angularjs で Web アプリを作成し、Angular マテリアル(質問に関連するかどうかは不明) とngMessagesを使用して、無効な入力に対するフィードバックをユーザーに提供します。

通常、提供されたディレクティブの検証では、次のような方法で検証できます。

<md-input-container>
    <input required name="myInput" ng-model="someModel">
    <div ng-messages="formName.myInput.$error">
        <div ng-message="required">This field is required.</div>
    </div> 
</md-input-container>

しかし、独自のカスタム ディレクティブを作成すると...

moduleName.directive('ngCustomdir', function(){
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function($scope, $element, $attrs, ngModel){
            //do some validation
            return validation; //<--true or false based on validation
        }
    };
}

それを私の入力に含めます...

<input required ng-customdir name="myInput" ng-model="someModel">

カスタム ディレクティブの検証に基づいて入力が無効な場合、フィールドが赤くなり、$invalid 値が true に設定されるため、入力が検証されることはわかっていますが、いつに基づいて ngMessages でメッセージを表示するかはわかりません。これが起こります。

<div ng-messages="formName.myInput.$error">
    <div ng-message="required">This field is required.</div>
    <div ng-message="customdir">This is what I need to appear.</div>
</div>

カスタム ディレクティブの検証が無効な場合、メッセージが表示されないようです。どうすればいいですか?事前に助けてくれてありがとう。

4

2 に答える 2

21

link関数にいくつかの検証を追加するだけです。

link: function($scope, $element, $attrs, ngModel){
        ngModel.$validators.required = function(modelValue) {
              //true or false based on required validation
        };

        ngModel.$validators.customdir= function(modelValue) {
              //true or false based on custome dir validation
        };
    }

モデルが変更されると、AngularJS はオブジェクト内のすべての検証関数を呼び出し$validatorsます。関数名に基づいて ng-message が表示されます。$validators に関する詳細情報:

https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

http://blog.thoughtram.io/angularjs/2015/01/11/exploring-angular-1.3-validators-pipeline.html

于 2015-06-30T00:21:14.670 に答える
2

Huy のソリューションのよりコンパクトな代替手段があります。

link: function($scope, $element, $attrs, ngModel){
    //validation true or false
    ngModel.$setValidity('required',validation);

    ngModel.$setValidity('customdir',validation);
}
于 2016-11-09T11:26:51.007 に答える