วิธีเพิ่มการตรวจสอบความถูกต้องที่กำหนดเองไปยังแบบฟอร์ม AngularJS?


278

ฉันมีรูปแบบที่มีช่องป้อนข้อมูลและการตั้งค่าการตรวจสอบความถูกต้องโดยการเพิ่มrequiredคุณสมบัติและเช่น แต่สำหรับบางสาขาฉันต้องทำการตรวจสอบเพิ่มเติม ฉันจะ "แตะ" เพื่อตรวจสอบความถูกต้องที่FormControllerควบคุมได้อย่างไร

การตรวจสอบความถูกต้องที่กำหนดเองอาจเป็นอะไรบางอย่างเช่น "ถ้ากรอกข้อมูลทั้ง 3 ฟิลด์แล้วจำเป็นต้องกรอกข้อมูลในฟิลด์นี้และต้องจัดรูปแบบด้วยวิธีใดวิธีหนึ่ง"

มีวิธีการFormController.$setValidityแต่ไม่เหมือน API สาธารณะดังนั้นฉันจึงไม่ควรใช้ การสร้างคำสั่งที่กำหนดเองและการใช้NgModelControllerดูเหมือนกับตัวเลือกอื่น แต่โดยพื้นฐานแล้วฉันจะต้องสร้างคำสั่งสำหรับกฎการตรวจสอบความถูกต้องที่กำหนดเองซึ่งฉันไม่ต้องการ

ที่จริงแล้วการทำเครื่องหมายเขตข้อมูลจากตัวควบคุมไม่ถูกต้อง (ในขณะที่ยังคงFormControllerซิงค์อยู่) อาจเป็นสิ่งที่ฉันต้องการในสถานการณ์ที่ง่ายที่สุดเพื่อให้งานเสร็จ แต่ฉันไม่รู้วิธีการทำเช่นนั้น


4
มีบทความที่ดีเกี่ยวกับการเข้ารหัสมอนสเตอร์สำหรับจัดการการตรวจสอบที่กำหนดเองในเชิงมุม JS ตรวจสอบนี้ออก
Anshu

มันไม่ใช่สิ่งที่ฉันกำลังมองหาเนื่องจากมันต้องการคำสั่งที่กำหนดเอง แต่ฉันจะยอมรับคำตอบของคุณเนื่องจากเป็นบทความที่ดีอยู่แล้ว
botteaap

ฉันสงสัยในสิ่งเดียวกันฉันชอบการควบคุมที่ระดับ FormController ตัวอย่างเช่นผมต้องการสั่งที่กำหนดเองบางอย่างที่จะธงเช่น FormController formName.$warningเป็นสิ่งที่ชอบ
Adam Waselnuk

2
ฉันเชื่อว่า$$ก่อนหน้านี้ไม่มี apis สาธารณะด้วย$การเป็นสาธารณะ ดูstackoverflow.com/questions/19338493/…
Daniel F

คำตอบ:


370

แก้ไข: เพิ่มข้อมูลเกี่ยวกับ ngMessages (> = 1.3.X) ด้านล่าง

ข้อความตรวจสอบความถูกต้องของฟอร์มมาตรฐาน (1.0.X ขึ้นไป)

เนื่องจากนี่เป็นหนึ่งในผลลัพธ์อันดับต้น ๆ หากคุณ Google "การตรวจสอบรูปแบบ Angular" ในขณะนี้ฉันต้องการเพิ่มคำตอบสำหรับสิ่งนี้สำหรับทุกคนที่เข้ามาจากที่นั่น

มีวิธีการใน FormController $ setValidity แต่นั่นไม่เหมือนกับ API สาธารณะดังนั้นฉันจึงไม่ควรใช้

มันเป็น "สาธารณะ" ไม่ต้องกังวล ใช้มัน. นั่นคือสิ่งที่มันมีไว้เพื่อ ถ้ามันไม่ได้ถูกใช้งาน, Angular devs จะแปรรูปมันเป็นส่วนตัว

ในการทำการตรวจสอบความถูกต้องที่กำหนดเองหากคุณไม่ต้องการใช้ Angular-UI เป็นคำตอบอื่น ๆ ที่แนะนำคุณสามารถย้อนกลับคำสั่งการตรวจสอบความถูกต้องของคุณเองได้

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 ก็อาจ preferrable เพื่อทดแทนng-ifสำหรับการng-showดังกล่าวข้างต้น

นี่คือลิงค์พลั่วเกอร์บังคับ

นอกจากนี้ฉันยังได้เขียนบล็อกบางรายการเกี่ยวกับหัวข้อนี้ซึ่งมีรายละเอียดเพิ่มเติมเล็กน้อย:

การตรวจสอบแบบฟอร์มเชิงมุม

สั่งการตรวจสอบที่กำหนดเอง

แก้ไข: ใช้ ngMessages ใน 1.3.X

ตอนนี้คุณสามารถใช้โมดูล ngMessages แทน ngShow เพื่อแสดงข้อความแสดงข้อผิดพลาดของคุณ มันจะใช้งานได้จริงทุกอย่างไม่จำเป็นต้องเป็นข้อความแสดงข้อผิดพลาด แต่นี่คือพื้นฐาน:

  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 ค่าที่ผิดพลาดจะถูกบันทึกลงในตัวแบบด้วย - จะเป็นการดีกว่าถ้าส่งคืนแบบไม่ได้กำหนดฉันเชื่อ (เมื่อค่าไม่ถูกต้อง)
georgiosd

5
+1 @georgiosd ... ถูกต้อง 100% เมื่อมองผ่านสิ่งที่ Angular ทำพวกเขากลับไม่ได้กำหนด อาจไม่ใช่เรื่องใหญ่ที่จะส่งคืนค่าเนื่องจากมีการส่งแบบจำลอง (หวังว่า) จากแบบฟอร์มที่ไม่ถูกต้อง ... แต่ปลอดภัยกว่าขออภัยฉันคิดว่า
เบ็นเลช

2
สิ่งที่ยอดเยี่ยม! หากคุณ Googled ทางของคุณที่นี่กำลังมองหาการเขียนที่ดีเกี่ยวกับการตรวจสอบความถูกต้องที่กำหนดเองใน Angular ตรวจสอบสิ่งที่ @blesh เขียน
maaachine

คุณตรวจสอบความถูกต้องของฟอร์มขั้นสูงกับ AngularJS และตัวกรองหรือไม่ มันแก้ไขการตรวจสอบตัวกรองโดยทั่วไป
Benny Bottema

1
ฉันคิดว่าคุณอาจตั้งใจทำreturn value ? valid : undefinedข้างต้น
GChorn

92

โครงการของ Angular-UI มีคำสั่ง ui-validate ซึ่งอาจจะช่วยคุณได้ ให้คุณระบุฟังก์ชั่นการโทรเพื่อทำการตรวจสอบความถูกต้อง

ดูที่หน้าตัวอย่าง: 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

คุณสามารถใช้ ng-required สำหรับสถานการณ์การตรวจสอบความถูกต้องของคุณ ("หากกรอกข้อมูลทั้ง 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
สิ่งนี้ใช้ได้สำหรับฉัน สำหรับการตรวจสอบอย่างง่ายที่ขึ้นอยู่กับค่าของเขตข้อมูลอื่น ๆ นี่เป็นวิธีที่จะไปแทนการเขียนกฎการตรวจสอบที่ซับซ้อน
VimalKumar

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'">

(โดยที่ field1 field2 และ field3 เป็นตัวแปรขอบเขตคุณอาจต้องการตรวจสอบว่าเขตข้อมูลไม่เท่ากับสตริงว่าง)

หากฟิลด์ไม่ผ่านvalidatorฟิลด์นั้นจะถูกทำเครื่องหมายว่าไม่ถูกต้องและผู้ใช้จะไม่สามารถส่งแบบฟอร์มได้

สำหรับกรณีและตัวอย่างการใช้งานเพิ่มเติมดูที่: https://github.com/turinggroup/angular-validator

คำเตือน: ฉันเป็นผู้เขียน 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()'}/>

หรือเพียงแค่ผ่านการแสดงออก (มันจะได้รับการตรวจสอบเริ่มต้นที่สำคัญ "ไม่ถูกต้อง If")

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

การสาธิต jsFiddle (รองรับการตั้งชื่อนิพจน์และหลายนิพจน์)

มันคล้ายกับui-validateแต่คุณไม่ต้องการฟังก์ชั่นการตรวจสอบความถูกต้องเฉพาะขอบเขต (ใช้งานได้ทั่วไป) และแน่นอนว่าคุณไม่ต้องการui.utilsด้วยวิธีนี้


ขอบคุณ เด็ดมาก มันมีประโยชน์เป็นพิเศษในการใช้กฎการตรวจสอบสำหรับรูปแบบไดนามิก อย่างไรก็ตามมันยังคงตั้งค่ารุ่นแม้จะไม่ถูกต้อง ยังไงก็ตามเพื่อป้องกันไม่ให้มันตั้ง modelValue ถ้ามันไม่ถูกต้อง?
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ตัวแปรโลคัลซึ่งคุณควรใช้เพื่อเปรียบเทียบกับตัวแปรอื่น

ก่อนหน้านี้:

ฉันพยายามปรับปรุง @Plantface code โดยการเพิ่มคำสั่งพิเศษ คำสั่งพิเศษนี้มีประโยชน์มากหากการแสดงออกของเราจำเป็นต้องดำเนินการเมื่อมีการเปลี่ยนแปลงในตัวแปร 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;
     });
};

สำหรับข้อมูลเพิ่มเติมโปรดดู


ใช้$validatorsAPI

คำตอบที่ยอมรับใช้$parsersและ$formattersไพพ์ไลน์เพื่อเพิ่มตัวตรวจสอบซิงโครนัสที่กำหนดเอง AngularJS 1.3+ เพิ่ม$validatorsAPI ดังนั้นไม่จำเป็นต้องใส่เครื่องมือตรวจสอบความถูกใน$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 สถานที่ที่ดีที่สุดในการกำหนดการตรวจสอบความถูกต้องที่กำหนดเองคือคำสั่ง 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 เป็นฟังก์ชั่น inbuilt เพื่อกำหนดสถานะของแบบจำลองให้ถูกต้อง / ไม่ถูกต้อง


1

ฉันขยายคำตอบของ @Ben Lesh ด้วยความสามารถในการระบุว่าการตรวจสอบเป็นแบบตรงตัวพิมพ์หรือไม่ (ค่าเริ่มต้น)

ใช้:

<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 ที่ยอดเยี่ยมนำเสนอในหัวข้อนี้ แต่พวกเขาไม่มีสิ่งที่ฉันกำลังมองหา วิธีการของฉัน: ความถูกต้องเชิงมุม - การตรวจสอบความถูกต้องตามสัญญาสำหรับการตรวจสอบแบบอะซิงโครนัส

วิธีแก้ปัญหาเชิงมุมสำหรับกรณีการใช้งานของ OP อาจมีลักษณะดังนี้:

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

นี่คือซอ , ถ้าคุณต้องการที่จะหมุน lib มีอยู่ในGitHubมีเอกสารรายละเอียดและการสาธิตสดมากมาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.