एक AngularJS फॉर्म में कस्टम सत्यापन कैसे जोड़ें?


278

मेरे पास इनपुट फ़ील्ड्स और वेलिडेशन सेटअप के साथ एक फॉर्म है, जिसमें requiredएट्रिब्यूट्स और इस तरह के ऐड हैं। लेकिन कुछ क्षेत्रों के लिए मुझे कुछ अतिरिक्त सत्यापन करने की आवश्यकता है। मैं सत्यापन के लिए "टैप" कैसे करूंगा किFormController नियंत्रित करता है?

कस्टम सत्यापन कुछ ऐसा हो सकता है "यदि ये 3 फ़ील्ड भरे हुए हैं, तो इस क्षेत्र की आवश्यकता है और इसे किसी विशेष क्षेत्र में स्वरूपित करने की आवश्यकता है"।

इसमें एक विधि है, FormController.$setValidityलेकिन यह सार्वजनिक API की तरह नहीं दिखता है इसलिए मैं इसका उपयोग नहीं करता हूं। एक कस्टम निर्देश बनाना और उपयोग करनाNgModelController अन्य विकल्प की तरह लगता है, लेकिन मूल रूप से मुझे प्रत्येक कस्टम सत्यापन नियम के लिए एक निर्देश बनाने की आवश्यकता होगी, जो मुझे नहीं चाहिए।

वास्तव में, नियंत्रक से एक क्षेत्र को अमान्य के रूप में चिह्नित करना (जबकि FormControllerसिंक में रखते हुए भी ) वह चीज हो सकती है जो मुझे काम करने के लिए सबसे सरल परिदृश्य में चाहिए, लेकिन मुझे नहीं पता कि यह कैसे करना है।


4
कोणीय जेएस में कस्टम मान्यताओं को संभालने के लिए कोडिंग मॉन्स्टर पर एक अच्छा लेख है। चेक इस बाहर
अंशु

यह बिल्कुल वैसा नहीं है जैसा मैं देख रहा हूं, क्योंकि इसके लिए कस्टम निर्देशों की आवश्यकता है, लेकिन मैं आपके उत्तर को स्वीकार करूंगा क्योंकि यह एक अच्छा लेख है।
बॉटलएप

मैं एक ही बात सोच रहा हूं, मुझे फॉर्म कंट्रोलर के स्तर पर कुछ नियंत्रण पसंद आएगा। उदाहरण के लिए, मैं कुछ कस्टम निर्देश को कुछ इस तरह के रूप में FormController उदाहरण को ध्वजांकित करना चाहता हूं formName.$warning
एडम वसेलनुक

2
मेरा मानना ​​है कि $$सार्वजनिक नहीं $होने के साथ, नो-पब्लिक एपीस से पहले । देखें stackoverflow.com/questions/19338493/...
डैनियल एफ

जवाबों:


370

संपादित करें: नीचे दिए गए ngMessages (> = 1.3.X) के बारे में जानकारी जोड़ी गई।

मानक प्रपत्र सत्यापन संदेश (1.0.X और ऊपर)

चूंकि यह शीर्ष परिणामों में से एक है यदि आप Google "कोणीय फॉर्म सत्यापन", वर्तमान में, मैं इसमें से आने वाले किसी भी व्यक्ति के लिए एक और उत्तर जोड़ना चाहता हूं।

FormController में एक तरीका है। $ setValidity लेकिन यह सार्वजनिक API की तरह नहीं दिखता है इसलिए मैं इसका उपयोग नहीं करता हूं।

यह "जनता" है, कोई चिंता नहीं। इसका इस्तेमाल करें। बस यही बात है। यदि इसका उपयोग नहीं किया जाता था, तो कोणीय देवों ने इसे बंद कर दिया होगा।

कस्टम सत्यापन करने के लिए, यदि आप सुझाए गए अन्य उत्तर के रूप में कोणीय-यूआई का उपयोग नहीं करना चाहते हैं, तो आप बस अपना सत्यापन निर्देश रोल कर सकते हैं।

app.directive('blacklist', function (){ 
   return {
      require: 'ngModel',
      link: function(scope, elem, attr, ngModel) {
          var blacklist = attr.blacklist.split(',');

          //For DOM -> model validation
          ngModel.$parsers.unshift(function(value) {
             var valid = blacklist.indexOf(value) === -1;
             ngModel.$setValidity('blacklist', valid);
             return valid ? value : undefined;
          });

          //For model -> DOM validation
          ngModel.$formatters.unshift(function(value) {
             ngModel.$setValidity('blacklist', blacklist.indexOf(value) === -1);
             return value;
          });
      }
   };
});

और यहाँ कुछ उदाहरण उपयोग है:

<form name="myForm" ng-submit="doSomething()">
   <input type="text" name="fruitName" ng-model="data.fruitName" blacklist="coconuts,bananas,pears" required/>
   <span ng-show="myForm.fruitName.$error.blacklist">
      The phrase "{{data.fruitName}}" is blacklisted</span>
   <span ng-show="myForm.fruitName.$error.required">required</span>
   <button type="submit" ng-disabled="myForm.$invalid">Submit</button>
</form>

नोट: 1.2.X में यह शायद विकल्प के ng-ifलिए बेहतर हैng-show ऊपर के है

यहाँ एक अनिवार्य है प्लंकर लिंक है

इसके अलावा, मैंने इस विषय के बारे में कुछ ब्लॉग प्रविष्टियाँ लिखी हैं जो थोड़ा और विस्तार में जाती हैं:

कोणीय रूप मान्यता

कस्टम सत्यापन निर्देश

संपादित करें: 1.3.X में ngMessages का उपयोग करना

अब आप अपने त्रुटि संदेशों को दिखाने के लिए ngShow के बजाय ngMessages मॉड्यूल का उपयोग कर सकते हैं। यह वास्तव में किसी भी चीज के साथ काम करेगा, इसमें त्रुटि संदेश नहीं है, लेकिन यहां मूल बातें हैं:

  1. शामिल <script src="angular-messages.js"></script>
  2. ngMessagesआपके मॉड्यूल घोषणा में संदर्भ :

    var app = angular.module('myApp', ['ngMessages']);
  3. उपयुक्त मार्कअप जोड़ें:

    <form name="personForm">
      <input type="email" name="email" ng-model="person.email" required/>
    
      <div ng-messages="personForm.email.$error">
        <div ng-message="required">required</div>
        <div ng-message="email">invalid email</div>
      </div>
    </form>

उपरोक्त मार्कअप में, ng-message="personForm.email.$error"मूल रूप से ng-messageबच्चे के निर्देशों के लिए एक संदर्भ निर्दिष्ट करता है । तब ng-message="required"और ng-message="email"देखने के लिए उस संदर्भ पर गुण निर्दिष्ट करें। सबसे महत्वपूर्ण बात, वे उन्हें जांचने के लिए एक आदेश भी निर्दिष्ट करते हैं । पहली बार यह सूची में पाया गया कि "सत्य" जीतता है, और यह उस संदेश को दिखाएगा और दूसरों को नहीं।

और ngMessages उदाहरण के लिए एक प्लंकर


6
यदि आप $ parsers.unshift पर जाने वाले फ़ंक्शन पर मान लौटाते हैं, तो गलत मानों को मॉडल में भी सहेजा जाएगा - यह अपरिभाषित वापसी के लिए बेहतर होगा मेरा मानना ​​है कि (जब मूल्य मान्य नहीं है)।
जॉर्ज

5
+1 @ बोरगोड्स ... 100% सही। कोणीय क्या करता है के माध्यम से देखते हुए, वे अपरिभाषित लौट रहे हैं। मूल्य को वापस करने के लिए शायद यह कोई बड़ी बात नहीं है , जैसा कि (उम्मीद है) अमान्य रूपों से मॉडल प्रस्तुत नहीं किए गए हैं ... लेकिन खेद से बेहतर सुरक्षित है, मुझे लगता है।
बेन लेश

2
उत्तम सामग्री! यदि आप अपने तरीके से यहाँ पर कोणीय में कस्टम सत्यापन पर एक अच्छे राइटअप की तलाश कर रहे हैं, तो बाहर की जाँच करें जो @blesh ने लिखा है
maaachine

क्या आपने AngularJS और फ़िल्टर के साथ उन्नत फ़ॉर्म सत्यापन की जाँच की ? यह फ़िल्टर सत्यापन को उदारता से हल करता है।
बेनी बोटेमा

1
मुझे लगता है कि आप return value ? valid : undefinedऊपर करने के लिए मतलब हो सकता है।
GChorn

92

कोणीय-यूआई की परियोजना में एक यूआई-मान्य निर्देश शामिल है, जो संभवतः आपको इसमें मदद करेगा। आइए आप सत्यापन करने के लिए कॉल करने के लिए एक फ़ंक्शन निर्दिष्ट करें।

डेमो पृष्ठ पर एक नज़र है: http://angular-ui.github.com/ , वैलिडेट शीर्षक पर जाएं।

डेमो पेज से:

<input ng-model="email" ui-validate='{blacklist : notBlackListed}'>
<span ng-show='form.email.$error.blacklist'>This e-mail is black-listed!</span>

फिर अपने नियंत्रक में:

function ValidateCtrl($scope) {
  $scope.blackList = ['bad@domain.com','verybad@domain.com'];
  $scope.notBlackListed = function(value) {
    return $scope.blackList.indexOf(value) === -1;
  };
}

यह मेरे लिए Angular 1.4
Nick

46

आप अपने सत्यापन परिदृश्य के लिए एनजी-आवश्यक का उपयोग कर सकते हैं ("यदि ये 3 फ़ील्ड भरे हुए हैं, तो यह फ़ील्ड आवश्यक है":

<div ng-app>
    <input type="text" ng-model="field1" placeholder="Field1">
    <input type="text" ng-model="field2" placeholder="Field2">
    <input type="text" ng-model="field3" placeholder="Field3">
    <input type="text" ng-model="dependentField" placeholder="Custom validation"
        ng-required="field1 && field2 && field3">
</div>

2
इसने मेरे लिए काम किया। अन्य क्षेत्रों के मूल्यों पर निर्भर करने वाली सरल मान्यताओं के लिए, यह जटिल सत्यापन नियमों के बजाय जाने का तरीका है
विमलकुमार

28

आप Angular-Validator का उपयोग कर सकते हैं ।

उदाहरण: किसी क्षेत्र को मान्य करने के लिए फ़ंक्शन का उपयोग करना

<input  type = "text"
    name = "firstName"
    ng-model = "person.firstName"
    validator = "myCustomValidationFunction(form.firstName)">

फिर आपके कंट्रोलर में आपको कुछ ऐसा होगा

$scope.myCustomValidationFunction = function(firstName){ 
   if ( firstName === "John") {
       return true;
    }

आप भी कुछ ऐसा कर सकते हैं:

<input  type = "text"
        name = "firstName"
        ng-model = "person.firstName"
        validator = "'!(field1 && field2 && field3)'"
        invalid-message = "'This field is required'">

(जहां फ़ील्ड 1 फ़ील्ड 2, और फ़ील्ड 3 स्कोप वैरिएबल हैं। आप यह भी जांचना चाह सकते हैं कि फ़ील्ड खाली स्ट्रिंग के बराबर नहीं है या नहीं)

यदि फ़ील्ड पास नहीं होती है validatorतो फ़ील्ड को अमान्य के रूप में चिह्नित किया जाएगा और उपयोगकर्ता फ़ॉर्म सबमिट नहीं कर पाएगा।

अधिक उपयोग के मामलों और उदाहरणों के लिए देखें: https://github.com/turinggroup/angular-validator

डिस्क्लेमर: मैं एंगुलर-वैलिडेटर का लेखक हूं


13

मैंने हाल ही में कोणीय फॉर्म इनपुट के अभिव्यक्ति-आधारित अमान्यकरण की अनुमति देने के लिए एक निर्देश बनाया। किसी भी मान्य कोणीय अभिव्यक्ति का उपयोग किया जा सकता है, और यह ऑब्जेक्ट नोटेशन का उपयोग करके कस्टम सत्यापन कुंजी का समर्थन करता है। कोणीय v1.3.8 के साथ परीक्षण किया गया

        .directive('invalidIf', [function () {
        return {
            require: 'ngModel',
            link: function (scope, elm, attrs, ctrl) {

                var argsObject = scope.$eval(attrs.invalidIf);

                if (!angular.isObject(argsObject)) {
                    argsObject = { invalidIf: attrs.invalidIf };
                }

                for (var validationKey in argsObject) {
                    scope.$watch(argsObject[validationKey], function (newVal) {
                        ctrl.$setValidity(validationKey, !newVal);
                    });
                }
            }
        };
    }]);

आप इसे इस तरह से उपयोग कर सकते हैं:

<input ng-model="foo" invalid-if="{fooIsGreaterThanBar: 'foo > bar',
                                   fooEqualsSomeFuncResult: 'foo == someFuncResult()'}/>

या बस एक अभिव्यक्ति में गुजरने से (इसे "अमान्य आईडी" का डिफ़ॉल्ट सत्यापन दिया जाएगा)

<input ng-model="foo" invalid-if="foo > bar"/>

13

यहां एक फॉर्म में कस्टम वाइल्डकार्ड अभिव्यक्ति सत्यापन करने का एक अच्छा तरीका है (से: उन्नत रूप सत्यापन AngularJS और फ़िल्टर के साथ ):

<form novalidate="">  
   <input type="text" id="name" name="name" ng-model="newPerson.name"
      ensure-expression="(persons | filter:{name: newPerson.name}:true).length !== 1">
   <!-- or in your case:-->
   <input type="text" id="fruitName" name="fruitName" ng-model="data.fruitName"
      ensure-expression="(blacklist | filter:{fruitName: data.fruitName}:true).length !== 1">
</form>
app.directive('ensureExpression', ['$http', '$parse', function($http, $parse) {
    return {
        require: 'ngModel',
        link: function(scope, ele, attrs, ngModelController) {
            scope.$watch(attrs.ngModel, function(value) {
                var booleanResult = $parse(attrs.ensureExpression)(scope);
                ngModelController.$setValidity('expression', booleanResult);
            });
        }
    };
}]);

jsField डेमो (अभिव्यक्ति नामकरण और कई भावों का समर्थन करता है)

यह समान है ui-validate, लेकिन आपको स्कोप स्पेसिफिक वैल्यूएशन फंक्शन (यह उदारतापूर्वक काम करता है) की जरूरत नहीं है और इसके लिए आपको इस तरह से ui.utils की जरूरत नहीं है ।


धन्यवाद। बहुत ही शांत। गतिशील रूपों के लिए सत्यापन नियम लागू करना विशेष रूप से उपयोगी है। हालाँकि, यह अभी भी मॉडल मूल्य निर्धारित करता है, भले ही वह अमान्य हो। वैसे भी इसे रोकने के लिए मॉडलवैल्यू सेट करें यदि यह अमान्य है?
युमेई

5

अपडेट करें:

एक ही कार्यक्षमता के साथ पिछले निर्देश (दो के बजाय एक) का बेहतर और सरल संस्करण:

.directive('myTestExpression', ['$parse', function ($parse) {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attrs, ctrl) {
            var expr = attrs.myTestExpression;
            var watches = attrs.myTestExpressionWatch;

            ctrl.$validators.mytestexpression = function (modelValue, viewValue) {
                return expr == undefined || (angular.isString(expr) && expr.length < 1) || $parse(expr)(scope, { $model: modelValue, $view: viewValue }) === true;
            };

            if (angular.isString(watches)) {
                angular.forEach(watches.split(",").filter(function (n) { return !!n; }), function (n) {
                    scope.$watch(n, function () {
                        ctrl.$validate();
                    });
                });
            }
        }
    };
}])

उदाहरण का उपयोग:

<input ng-model="price1" 
       my-test-expression="$model > 0" 
       my-test-expression-watch="price2,someOtherWatchedPrice" />
<input ng-model="price2" 
       my-test-expression="$model > 10" 
       my-test-expression-watch="price1" 
       required />

परिणाम: पारस्परिक रूप से आश्रित परीक्षण अभिव्यक्ति जहां सत्यापनकर्ताओं को दूसरे के निर्देश मॉडल और वर्तमान मॉडल के परिवर्तन पर निष्पादित किया जाता है।

परीक्षण अभिव्यक्ति में स्थानीय $modelचर है जिसे आपको अन्य चर की तुलना करने के लिए उपयोग करना चाहिए।

पहले:

मैंने अतिरिक्त निर्देश जोड़कर @Plantface कोड को बेहतर बनाने का प्रयास किया है। यदि हमारी अभिव्यक्ति को एक से अधिक ngModel वैरिएबल में परिवर्तन किया जाता है, तो यह अतिरिक्त निर्देश बहुत उपयोगी है।

.directive('ensureExpression', ['$parse', function($parse) {
    return {
        restrict: 'A',
        require: 'ngModel',
        controller: function () { },
        scope: true,
        link: function (scope, element, attrs, ngModelCtrl) {
            scope.validate = function () {
                var booleanResult = $parse(attrs.ensureExpression)(scope);
                ngModelCtrl.$setValidity('expression', booleanResult);
            };

            scope.$watch(attrs.ngModel, function(value) {
                scope.validate();
            });
        }
    };
}])

.directive('ensureWatch', ['$parse', function ($parse) {
    return {
        restrict: 'A',
        require: 'ensureExpression',
        link: function (scope, element, attrs, ctrl) {
            angular.forEach(attrs.ensureWatch.split(",").filter(function (n) { return !!n; }), function (n) {
                scope.$watch(n, function () {
                    scope.validate();
                });
            });
        }
    };
}])

क्रॉस वैरिफाइड फ़ील्ड बनाने के लिए इसका उपयोग करने का उदाहरण:

<input name="price1"
       ng-model="price1" 
       ensure-expression="price1 > price2" 
       ensure-watch="price2" />
<input name="price2" 
       ng-model="price2" 
       ensure-expression="price2 > price3" 
       ensure-watch="price3" />
<input name="price3" 
       ng-model="price3" 
       ensure-expression="price3 > price1 && price3 > price2" 
       ensure-watch="price1,price2" />

ensure-expressionजब ng-modelकोई भी ensure-watchचर बदला जाता है तो मॉडल को मान्य करने के लिए निष्पादित किया जाता है।


4

@synergetic मुझे लगता है कि @blesh फ़ंक्शन को नीचे के रूप में मान्य करने के लिए मानता है

function validate(value) {
    var valid = blacklist.indexOf(value) === -1;
    ngModel.$setValidity('blacklist', valid);
    return valid ? value : undefined;
}

ngModel.$formatters.unshift(validate);
ngModel.$parsers.unshift(validate);

4

कस्टम मान्यताएँ जो सर्वर को कॉल करती हैं

NgModelController $asyncValidatorsAPI का उपयोग करें, जो अतुल्यकालिक सत्यापन को संभालता है, जैसे $httpबैकएंड के लिए अनुरोध करना। ऑब्जेक्ट में जोड़े गए फ़ंक्शंस को एक वादा वापस करना चाहिए जिसे अमान्य होने पर हल किया जाना चाहिए या अस्वीकार किया जाना चाहिए। इन-प्रगति async सत्यापन कुंजी द्वारा संग्रहीत किए जाते हैं ngModelController.$pending। अधिक जानकारी के लिए, AngularJS डेवलपर गाइड - फ़ॉर्म (कस्टम सत्यापन) देखें

ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) {
  var value = modelValue || viewValue;

  // Lookup user by username
  return $http.get('/api/users/' + value).
     then(function resolved() {
       //username exists, this means validation fails
       return $q.reject('exists');
     }, function rejected() {
       //username does not exist, therefore this validation passes
       return true;
     });
};

अधिक जानकारी के लिए देखें


$validatorsएपीआई का उपयोग करना

स्वीकृत उत्तर कस्टम सिंक्रोनस वैद्यक जोड़ने के लिए $parsersऔर $formattersपाइपलाइनों का उपयोग करता है । 1.3+ एक जोड़ा AngularJS $validatorsएपीआई तो में प्रमाणकों डाल करने के लिए कोई जरूरत नहीं है $parsersऔर $formattersपाइपलाइनों:

app.directive('blacklist', function (){ 
   return {
      require: 'ngModel',
      link: function(scope, elem, attr, ngModel) {           
          ngModel.$validators.blacklist = function(modelValue, viewValue) {
              var blacklist = attr.blacklist.split(',');
              var value = modelValue || viewValue;
              var valid = blacklist.indexOf(value) === -1;
              return valid;
          });    
      }
   };
});

अधिक जानकारी के लिए, AngularJS ngModelController API संदर्भ - $ सत्यापनकर्ता देखें


3

AngularJS में Custom Validation को परिभाषित करने के लिए सबसे अच्छा स्थान Cutsom निर्देश है। AngularJS एक ngMessages मॉड्यूल प्रदान करता है।

ngMessages एक निर्देश है जो एक कुंजी / मान ऑब्जेक्ट की स्थिति के आधार पर संदेशों को दिखाने और छिपाने के लिए डिज़ाइन किया गया है जो इसे सुनता है। निर्देश स्वयं ngModel $ त्रुटि ऑब्जेक्ट (जो सत्यापन त्रुटियों की कुंजी / मान स्थिति संग्रहीत करता है) के साथ त्रुटि संदेश की गणना करता है।

कस्टम प्रपत्र सत्यापन के लिए, व्यक्ति को कस्टम निर्देश के साथ ngMessages मॉड्यूल का उपयोग करना चाहिए। मेरे पास एक साधारण सत्यापन है, जो यह जांच करेगा कि क्या संख्या की लंबाई कम है, तो स्क्रीन पर 6 त्रुटि प्रदर्शित करें

 <form name="myform" novalidate>
                <table>
                    <tr>
                        <td><input name='test' type='text' required  ng-model='test' custom-validation></td>
                        <td ng-messages="myform.test.$error"><span ng-message="invalidshrt">Too Short</span></td>
                    </tr>
                </table>
            </form>

यहाँ कस्टम सत्यापन निर्देश कैसे बनाया जाए

angular.module('myApp',['ngMessages']);
        angular.module('myApp',['ngMessages']).directive('customValidation',function(){
            return{
            restrict:'A',
            require: 'ngModel',
            link:function (scope, element, attr, ctrl) {// 4th argument contain model information 

            function validationError(value) // you can use any function and parameter name 
                {
                 if (value.length > 6) // if model length is greater then 6 it is valide state
                 {
                 ctrl.$setValidity('invalidshrt',true);
                 }
                 else
                 {
                 ctrl.$setValidity('invalidshrt',false) //if less then 6 is invalide
                 }

                 return value; //return to display  error 
                }
                ctrl.$parsers.push(validationError); //parsers change how view values will be saved in the model
            }
            };
        });

$setValidity मॉडल राज्य को मान्य / अमान्य में सेट करने के लिए इनबिल्ट फ़ंक्शन है


1

मैंने यह निर्दिष्ट करने की क्षमता के साथ @Ben लेश का जवाब बढ़ाया कि क्या सत्यापन संवेदनशील है या नहीं (डिफ़ॉल्ट)

उपयोग:

<input type="text" name="fruitName" ng-model="data.fruitName" blacklist="Coconuts,Bananas,Pears" caseSensitive="true" required/>

कोड:

angular.module('crm.directives', []).
directive('blacklist', [
    function () {
        return {
            restrict: 'A',
            require: 'ngModel',
            scope: {
                'blacklist': '=',
            },
            link: function ($scope, $elem, $attrs, modelCtrl) {

                var check = function (value) {
                    if (!$attrs.casesensitive) {
                        value = (value && value.toUpperCase) ? value.toUpperCase() : value;

                        $scope.blacklist = _.map($scope.blacklist, function (item) {
                            return (item.toUpperCase) ? item.toUpperCase() : item
                        })
                    }

                    return !_.isArray($scope.blacklist) || $scope.blacklist.indexOf(value) === -1;
                }

                //For DOM -> model validation
                modelCtrl.$parsers.unshift(function (value) {
                    var valid = check(value);
                    modelCtrl.$setValidity('blacklist', valid);

                    return value;
                });
                //For model -> DOM validation
                modelCtrl.$formatters.unshift(function (value) {
                    modelCtrl.$setValidity('blacklist', check(value));
                    return value;
                });
            }
        };
    }
]);

0

इस थ्रेड में कुछ बेहतरीन उदाहरण और लिबास प्रस्तुत किए गए, लेकिन उनमें वह नहीं था जो मैं खोज रहा था। मेरा दृष्टिकोण: कोणीय-वैधता - अतुल्यकालिक सत्यापन के लिए एक वादा आधारित सत्यापन कार्य, वैकल्पिक बूटस्ट्रैप स्टाइल बेक्ड-इन के साथ।

ओपी के उपयोग के मामले के लिए कोणीय-वैधता समाधान कुछ इस तरह दिखाई दे सकता है:

<input  type="text" name="field4" ng-model="field4"
        validity="eval"
        validity-eval="!(field1 && field2 && field3 && !field4)"
        validity-message-eval="This field is required">

यहाँ एक फिडल है , अगर आप इसे स्पिन के लिए लेना चाहते हैं। यह GitHub पर उपलब्ध है , इसमें विस्तृत दस्तावेज हैं, और बहुत सारे लाइव डेमो हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.