2013-06-02 6 views
5

मैंने अपने फॉर्म के लिए एक सत्यापन निर्देश बनाया है। यह मूल रूप से किसी अन्य फ़ील्ड के डेटा के आधार पर फ़ील्ड मान को मान्य करता है।मैं एक कोणीय सत्यापन निर्देश को चलाने के लिए कैसे मजबूर कर सकता हूं?

यह काम करता है सही :-)

मेरे समस्या यह है कि यदि सत्यापन के बाद अन्य क्षेत्र में परिवर्तन मार डाला गया था, मान्यता फिर से नहीं चलेंगे है।

var myApp = angular.module('myApp', []) 

.directive('validateInteger', function() { 
    return { 
    require: 'ngModel', 
    link: function(scope, elm, attrs, ctrl) { 
     ctrl.$parsers.unshift(function(viewValue) { 
      var int1val = scope.int1; 
      scope.int2valid = (viewValue > int1val) ? "valid" : undefined; 
      if (scope.int2valid == "valid") { 
       ctrl.$setValidity('higher', true); 
       return viewValue; 
      } else { 
       ctrl.$setValidity('higher', false); 
       return undefined; 
     } 
     }); 
    } 
    }; 
}); 

jsfiddle: http://jsfiddle.net/hanspc/vCFFQ/

+0

यह "सत्यापन" समस्या को सही नहीं करेगा, लेकिन आप 'ng-hide = "int2> int1" 'के साथ div को छुपा सकते हैं,'>' ऑपरेटर को छुपा अभिव्यक्ति में सही तरीके से सेट कर सकते हैं। – rGil

उत्तर

3

यह वास्तव में बुरा विचार अपने निर्देश में कुछ क्षेत्रों के लिए स्पष्ट रूप से उल्लेख करने के लिए है। unportability, कोड पुनरावृत्ति, भंगुरता, ...

बस ऐसे ही कुछ करना:

<input type="text" ng-model="int2" validate-greater-integer="int1" /> 

और: आप कर सकते हैं

myApp.directive('validateGreaterInteger', function() { 
    return { 
    require: 'ngModel', 
    scope: { 
     otherInteger : '=validateGreaterInteger', 
    } 
    link: function(scope, elm, attrs, ctrl) { 
     ctrl.$parsers.unshift(function(viewValue) { 
     if (viewValue > scope.otherInteger) { 
      ctrl.$setValidity('higher', true); 
      return viewValue; 
     } else { 
      ctrl.$setValidity('higher', false); 
      return undefined; 
     } 
    } 
}); 

तो बस आप देख सकते हैं, इस कमियां की एक बहुत कुछ है the typical state control करें (उदाहरण के लिए "फ़ॉर्म बनाने और नियंत्रण करने के लिए बाइंडिंग" अनुभाग देखें)।

कृपया ध्यान दें कि, इस मामले में, आप input[number] और इसके min पैरामीटर का अधिक उपयोग कर सकते हैं। टिप्पणी में चर्चा के बाद


संपादित करें:

खैर, NgModelController.$parsers में कार्यों स्पष्ट रूप से मॉडल परिवर्तन के केवल जब सामग्री कहा जाता है। आप क्या करना चाहते हैं जब भी int1 या int2 परिवर्तन को सत्यापन करना है। तो बस इसे :-) कार्य करें:

link: function(scope, elm, attrs, ctrl) { 
    scope.$watch('data', function (data) { 
     if (data.int2 > data.int1) { 
      ctrl.$setValidity('higher', true); 
      return data.int2; 
     } else { 
      ctrl.$setValidity('higher', false); 
      return undefined; 
    } 
    }, true); 

(अपने फिडल में int2valid) अपनी खुद की मान्यता चर का प्रयोग भी बहुत ही अजीब है। जैसे कुछ के साथ the typical state control का उपयोग करें।

+0

मुझे दोषों की जानकारी है - यह मेरे सत्यापन निर्देश का केवल एक साधारण उदाहरण था :-) सत्यापन कई चीजों के लिए पूर्णांक की जांच करता है (न्यूनतम, अधिकतम, अन्य क्षेत्रों आदि के आधार पर कुछ गणना आदि) और जब अन्य फ़ील्ड बदल जाते हैं उपयोगकर्ता, मुझे फिर से चलाने के लिए सत्यापन की आवश्यकता है। मैंने इसके बजाय एक स्कोप फ़ंक्शन का उपयोग करने की कोशिश की है (अन्य फ़ील्ड पर एनजी-चेंज द्वारा बुलाया गया है), लेकिन मैं स्कोप से $ setValidity फ़ंक्शन का उपयोग नहीं कर सकता - मुझे लगता है: 'ऑब्जेक्ट # है कोई विधि '$ setValidity'' – hansch

+0

क्या मेरा प्रस्ताव समस्या का समाधान नहीं करता है? संक्षेप में: केवल अपने निर्देशों में आवश्यक पैरामीटर का उपयोग करें, उन्हें स्थानीय '' स्कोप'' से बांधें और अपनी सभी गणना '' 'unshift''' फ़ंक्शन में करें, जैसा कि मैं अपने उदाहरण में करता हूं। – Blackhole

+0

वास्तव में नहीं, क्योंकि सत्यापन नहीं जानता कि अन्य मान बदलता है या नहीं। Http://jsfiddle.net/hanspc/vCFFQ/4/ Int1 में 2 डालें, और 3 int2 में डालें। फिर Int1 से 5 को बदलें, और Int2 मान्य रहता है भले ही यह वास्तव में नहीं है :-) – hansch

2

हो सकता है कि एक आसान समाधान आपके त्रुटि अवधि के निचले भाग के एनजी-शो के अंदर एक वॉचर या यहां तक ​​कि एक अभिव्यक्ति के साथ होगा।

एनजी शो के निर्देश के अंदर एक अभिव्यक्ति का उपयोग करते हुए इस तरह होगा:

<span ng-show="int1 > int2" style="color: red; display:none"> 

नहीं तो आप मॉडल में परिवर्तन int1 और INT2 के लिए देख सकते हैं और उनके मूल्यों की तुलना कर सकते: यहाँ

$scope.$watch('int1+int2', function() { 
    if($scope.int1 > $scope.int2) { 
     $scope.error = true;  
    }else { 
     $scope.error = false; 
    } 
}) 

<span ng-show="error" style="color: red; display:none"> 

fiddle

+2

यदि आप कुछ जटिल सत्यापन नियम की तलाश में हैं तो उत्कृष्ट समाधान और वह नियम केवल एक पृष्ठ पर आवश्यक है – coure2011

संबंधित मुद्दे

 संबंधित मुद्दे