কীভাবে একটি AngularJS ফর্মটিতে কাস্টম বৈধতা যুক্ত করবেন?


278

আমার সাথে ইনপুট ক্ষেত্র এবং বৈধতা এবং সেগুলি যুক্ত করে বৈধতা সেটআপ সহ একটি ফর্ম রয়েছে required। তবে কিছু ক্ষেত্রের জন্য আমাকে কিছু অতিরিক্ত বৈধতা দেওয়া দরকার। যে বৈধতা FormControllerনিয়ন্ত্রণ করে আমি কীভাবে "ট্যাপ ইন" করব ?

কাস্টম বৈধতা কিছু হতে পারে "যদি এই 3 টি ক্ষেত্র পূরণ করা হয় তবে এই ক্ষেত্রটি প্রয়োজনীয় এবং একটি নির্দিষ্ট উপায়ে ফর্ম্যাট করা প্রয়োজন"।

এর মধ্যে একটি পদ্ধতি রয়েছে FormController.$setValidityতবে এটি পাবলিক এপিআইয়ের মতো লাগে না তাই আমি এটি ব্যবহার না করে। একটি কাস্টম নির্দেশিকা তৈরি করা এবং NgModelControllerঅন্য বিকল্পের মতো দেখতে ব্যবহার করা হলেও মূলত প্রতিটি কাস্টম বৈধতা রুলের জন্য আমার একটি নির্দেশিকা তৈরি করা প্রয়োজন যা আমি চাই না।

প্রকৃতপক্ষে, কন্ট্রোলার থেকে ক্ষেত্রটি অবৈধ হিসাবে চিহ্নিত করা (এছাড়াও FormControllerসিঙ্ক রাখার সময় ) কাজটি করার জন্য সবচেয়ে সহজ দৃশ্যে আমার প্রয়োজন হওয়া জিনিস হতে পারে, তবে আমি কীভাবে এটি করব তা জানি না।


4
কৌণিক জেএসে কাস্টম বৈধতাগুলি পরিচালনা করার জন্য দানবকে কোডিংয়ের বিষয়ে একটি নিবন্ধ রয়েছে। পরীক্ষা করে দেখুন এই আউট
Anshu

এটি ঠিক আমি যা খুঁজছি তা নয়, কারণ এতে কাস্টম নির্দেশিকা প্রয়োজন, তবে আমি আপনার উত্তরটি গ্রহণ করব কারণ এটি যাইহোক একটি ভাল নিবন্ধ।
botteaap

আমি একই জিনিসটি ভাবছি, আমি ফর্মকন্ট্রোলারের স্তরে কিছু নিয়ন্ত্রণ পছন্দ করব। উদাহরণস্বরূপ, আমি পতাকা নির্দিষ্ট কাস্টম নির্দেশনা ভালো কিছু যেমন FormController উদাহরণস্বরূপ চান formName.$warning
অ্যাডাম ওয়াসেলনুক

2
আমি বিশ্বাস করি যে $$পাবলিক $হওয়ার সাথে সাথে কোনও নো-পাবলিক এপিআইস রয়েছে । স্ট্যাকওভারফ্লো.com
ড্যানিয়েল এফ

উত্তর:


370

সম্পাদনা করুন: নীচে ngMessages (> = 1.3.X) সম্পর্কে যুক্ত তথ্য।

স্ট্যান্ডার্ড ফর্ম বৈধতা বার্তা (1.0.X এবং উপরে)

যেহেতু আপনি যদি গুগল "অ্যাংুলার ফর্ম বৈধকরণ" গুগল করেন এটি শীর্ষ ফলাফলগুলির মধ্যে একটি, বর্তমানে, আমি সেখান থেকে যে কেউ আসার জন্য এটির জন্য আরও একটি উত্তর যুক্ত করতে চাই।

ফর্মকন্ট্রোলারে একটি পদ্ধতি রয়েছে $ সেটভিলেডিটি তবে এটি কোনও পাবলিক এপিআইয়ের মতো লাগে না তাই আমি এটি ব্যবহার না করে।

এটি "প্রকাশ্য", কোনও উদ্বেগের বিষয় নয়। এটা ব্যবহার করো. এটাই তার জন্য। যদি এটি ব্যবহার করার উদ্দেশ্যে না বোঝানো হত তবে অ্যাংুলার ডেভগুলি এটিকে বন্ধ করে ব্যক্তিগতকৃত করে তুলত।

কাস্টম বৈধতা করতে, আপনি যদি উত্তর উত্তর হিসাবে কৌনিক-ইউআই ব্যবহার করতে না চান, আপনি কেবল নিজের বৈধতা নির্দেশিকা রোল করতে পারেন।

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

এখানে একটি বাধ্যতামূলক plunker লিঙ্ক

এছাড়াও, আমি কেবল এই বিষয় সম্পর্কে কয়েকটি ব্লগ এন্ট্রি লিখেছি যা কিছুটা আরও বিশদে চলে যায়:

কৌণিক ফর্ম বৈধকরণ

কাস্টম বৈধকরণ নির্দেশাবলী

সম্পাদনা করুন: 1.3.X এ 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"দেখার জন্য সেই প্রসঙ্গে বৈশিষ্ট্য নির্দিষ্ট করুন। সবচেয়ে গুরুত্বপূর্ণ, তারা তাদের চেক ইন করার জন্য একটি আদেশও নির্দিষ্ট করে । তালিকার মধ্যে এটি প্রথমটি খুঁজে পায় যা "সত্যবাদী" জিতে যায় এবং এটি সেই বার্তাটি প্রদর্শন করবে এবং অন্য কোনওটিই নয়।

এবং এনজিমেজেস উদাহরণগুলির জন্য একটি প্লাঙ্কার


6
আপনি the 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;
  };
}

আশ্চর্যের বিষয় যে এটি আমার জন্য কৌনিক 1.4 ব্যবহার করে কাজ করে না
নিক 12

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

আপনি অ্যাংুলার-ভ্যালিডেটর ব্যবহার করতে পারেন ।

উদাহরণ: একটি ক্ষেত্র যাচাই করার জন্য একটি ফাংশন ব্যবহার করা

<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 স্কোপ ভেরিয়েবল রয়েছে the ক্ষেত্রগুলি খালি স্ট্রিংয়ের সমান হয় না কিনা তা আপনিও দেখতে চাইতে পারেন)

যদি ক্ষেত্রটি পাস না করে validatorতবে ক্ষেত্রটি অবৈধ হিসাবে চিহ্নিত হবে এবং ব্যবহারকারী ফর্মটি জমা দিতে সক্ষম হবে না।

আরও ব্যবহারের ক্ষেত্রে এবং উদাহরণগুলির জন্য দেখুন: https://github.com/turinggroup/angular-uthorator

দাবি অস্বীকার: আমি কৌণিক-বৈধকারকের লেখক


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

কোনও ফর্মটিতে কাস্টম ওয়াইল্ডকার্ড এক্সপ্রেশন বৈধতাগুলি করার দুর্দান্ত উপায় এখানে থেকে (থেকে: অ্যাঙ্গুলারজেএস এবং ফিল্টারগুলির সাথে অ্যাডভান্সড ফর্মের বৈধতা ):

<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);
            });
        }
    };
}]);

jsFizz ডেমো (এক্সপ্রেশন নামকরণ এবং একাধিক এক্সপ্রেশন সমর্থন করে)

এটি অনুরূপ ui-validate, তবে আপনার কোনও সুযোগ নির্দিষ্ট বৈধতা ফাংশন প্রয়োজন (এটি সাধারণভাবে কাজ করে) এবং অবশ্যই আপনার এইভাবে ui.utils প্রয়োজন হবে না ।


ধন্যবাদ। খুব ঠান্ডা. গতিশীল ফর্মগুলির জন্য বৈধতা বিধি প্রয়োগ করার জন্য এটি বিশেষভাবে কার্যকর। তবে এটি এখনও অবৈধ মডেলের মান সেট করে value যাইহোক এটি রোধ করতে মডেলওয়ালু সেটটি অবৈধ হলে?
YuMei

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ভেরিয়েবল যা আপনি এটি অন্যান্য ভেরিয়েবলের সাথে তুলনা করতে ব্যবহার করা উচিত।

পূর্বে:

আমি অতিরিক্ত নির্দেশিকা যুক্ত করে @ প্লান্টফেস কোড উন্নত করার চেষ্টা করেছি। একাধিক এনজিমোডেল ভেরিয়েবলের পরিবর্তনগুলি যখন করা হয় তখন আমাদের এক্সপ্রেশনটি কার্যকর করা দরকার হলে এই অতিরিক্ত নির্দেশিকাটি খুব কার্যকর।

.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

@ সাইনারজেটিক আমি মনে করি @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

কাস্টম মান যা একটি সার্ভার কল করে

এনজিএমডেলকন্ট্রোলার $asyncValidatorsএপিআই ব্যবহার করুন যা অ্যাসিক্রোনাস বৈধকরণকে পরিচালনা করে, যেমন $httpব্যাকএন্ডে অনুরোধ করা। অবজেক্টে যুক্ত ফাংশনগুলিকে অবশ্যই একটি প্রতিশ্রুতি ফিরিয়ে দিতে হবে যা বৈধ হওয়ার সময় সমাধান করতে হবে বা অবৈধ হলে প্রত্যাখ্যান করা উচিত। অগ্রগতিতে অ্যাসিঙ্ক বৈধতাগুলি কী দ্বারা সঞ্চিত হয় 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 একটি ngMessages মডিউল সরবরাহ করে।

এনজিমেজেস হ'ল একটি নির্দেশ যা কোনও কী / মান অবজেক্টের শোনার অবস্থার ভিত্তিতে বার্তা প্রদর্শন এবং আড়াল করার জন্য ডিজাইন করা হয়েছে। নির্দেশটি নিজেই এনজিএমডেল $ ত্রুটিযুক্ত বস্তুর সাথে ত্রুটি বার্তা প্রতিবেদনের পরিপূরক করে (যা বৈধতা ত্রুটির একটি কী / মান অবস্থিতি সংরক্ষণ করে)।

কাস্টম ফর্ম যাচাইয়ের জন্য কাস্টম নির্দেশাবলীর সাথে এনজিমেজেস মডিউলগুলি ব্যবহার করা উচিত e এখানে আমার একটি সাধারণ বৈধতা রয়েছে যা যাচাই করবে যদি সংখ্যাটির দৈর্ঘ্য কম হয় তবে স্ক্রিনে একটি ত্রুটি প্রদর্শন করুন will

 <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

আমি বৈদিকরণ কেস সংবেদনশীল কিনা তা নির্দিষ্ট করার ক্ষমতা সহ @ বেন লেশের উত্তরটি প্রসারিত করেছি (ডিফল্ট)

ব্যবহার করুন:

<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

এই থ্রেডে উপস্থাপন করা কিছু দুর্দান্ত উদাহরণ এবং libs, তবে আমি যা খুঁজছিলাম তা তাদের কাছে যথেষ্ট ছিল না। আমার পদ্ধতির: কৌণিক-বৈধতা - অ্যাসিনক্রোনাস বৈধতার জন্য একটি প্রতিশ্রুতি ভিত্তিক বৈধতা লাইব, Bootচ্ছিক বুটস্ট্র্যাপ স্টাইলিং বেকড ইন সহ।

ওপির ব্যবহারের ক্ষেত্রে কৌণিক-বৈধতার সমাধানটি এর মতো দেখতে পারে:

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

এখানে একটি স্পিডল , আপনি যদি এটি কোনও স্পিনের জন্য নিতে চান। এই লিবিবটি গিটহাবে উপলভ্য রয়েছে , এর বিশদ ডকুমেন্টেশন এবং প্রচুর লাইভ ডেমো রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.