2013-04-09 33 views
29

मैं एक निर्देश बनाने की कोशिश करता हूं जो किसी इनपुट फ़ील्ड को अमान्य के रूप में चिह्नित करते समय कुछ क्रियाओं को छूना चाहिए। इस उदाहरण के लिए देता है मान मैं एक निर्देश जो की जाँच करता है, तो इनपुट अभाज्य संख्या है, और मैं एक निर्देश जो तत्व जब यह अवैध है करने के लिए एक वर्ग कहते हैं बनाना चाहते हैं:कोणीय जेएस निर्देश घड़ी वैधता

<input type="text" ng-model="primeNumber" validate-prime invalid-add-class="error"> 

सत्यापित करें-प्राइम का उपयोग करता है मॉडल की वैधता को अद्यतन करने के लिए एनजी मॉडल पर पार्सर्स और फॉर्मेटर्स।

अब मैं अमान्य-एड-क्लास निर्देश चाहता हूं कि मॉडल अमान्य होने पर वर्ग "त्रुटि" जोड़ने के लिए और वैध होने पर इसे हटाने के लिए। दूसरे शब्दों में, इसे मॉडल नियंत्रक की $ मान्य (या $ अमान्य) संपत्ति देखना चाहिए। हालांकि, मैं यह नहीं समझ सकता कि यह काम कैसे प्राप्त करें। मैंने कोशिश की:

link : function(scope, element, attrs, ctrl) { 
    ctrl.$watch("$valid", function(newVal, oldVal) { 
    //never fired 
    }); 
} 

शायद मैं कुछ चरम पर देख सकता हूं, लेकिन मुझे नहीं पता कि किस चर के लिए देखना है।

तो मॉडल की वैधता कब बदलती है तो मुझे कैसे सूचित किया जा सकता है? यदि आप एक <form> है, तो

+0

यदि आप अपना निर्देश साझा कर सकते हैं तो यह अच्छा होगा! –

+0

मुझे याद नहीं है कि मैंने वास्तव में इसका क्या उपयोग किया है, लेकिन कैओटोऑन का दूसरा समाधान पहले से ही संपूर्ण लिंक फ़ंक्शन है। वैधता में परिवर्तन होने पर केवल दूसरे कार्य का शरीर ही आप जो भी कार्य करना चाहते हैं उसे भरना चाहिए। – Tiddo

उत्तर

60

, जोड़ने के एक name इसे करने के लिए और अपने इनपुट के लिए एक name (मान 'MyForm' की सुविधा देता है) (की सुविधा देता है मान myInput)। आप द्वारा $watch इस में सक्षम होना चाहिए: यदि आप एक form नहीं है, तो

scope.$watch('myForm.myInput.$valid', function(validity) {}) 

, तो आप हमेशा एक समारोह देख सकते हैं। इस तरह:

scope.$watch(function() { return ctrl.$valid; }, function(validity){}); 

आप प्रपत्र दृष्टिकोण here के बारे में अधिक पढ़ सकते हैं।

+1

आपका दूसरा दृष्टिकोण मेरे लिए किया, धन्यवाद! – Tiddo

7

हमारा लक्ष्य, सामान्य रूप से, किसी भी रूप या इनपुट से स्वतंत्र रूप से निर्देश का काम करना चाहिए। हम इसे स्थानीय $valid संपत्ति को अनिवार्य रूप से बिना किसी विशिष्ट फ़ॉर्म & इनपुट नाम पर बाध्य किए बिना संपत्ति को पढ़ने की अनुमति कैसे दे सकते हैं?

बस अपने निर्देशक कॉन्फ़िगरेशन के गुणों में से एक के रूप में require: 'ngModel' का उपयोग करें। यह स्थानीय एनजी मॉडेल नियंत्रक को लिंक फ़ंक्शन के चौथे तर्क के रूप में इंजेक्ट करेगा, और आप पर सीधे $valid पर किसी भी विशेष रूप या इनपुट के निर्देश को कार्यान्वित करने की आवश्यकता के बिना रख सकते हैं।

require: 'ngModel', 
link: function postLink(scope, element, attrs, controller) { 
    scope.inputCtrl = controller; 
    scope.$watch('inputCtrl.$valid', handlerFunc) 
} 

हैंडलर को उस संरचना के साथ $ मान्य में परिवर्तनों पर लगातार आग लगनी चाहिए। this Fiddle देखें, जहां इनपुट को यू.एस. ज़िप-कोड या ज़िप + 4 के पैटर्न के लिए मान्य किया गया है। हर बार वैधता में परिवर्तन होने पर आपको एक चेतावनी मिल जाएगी।

संपादित करें 3/21/14: यह पोस्ट पहले कार्यान्वयन की समस्या के गलत कारण पर तय करने के लिए मेरा भ्रम पर लटका हुआ था। मेरी गलती। ऊपर दिया गया उदाहरण उस निर्धारण को हटा देता है। इसके अलावा, यह दिखाता है कि यह दृष्टिकोण वास्तव में काम करता है, और हमेशा एक बार जब आप घड़ी अभिव्यक्ति के चारों ओर उद्धरण जोड़ते हैं।

+0

क्या आप वाकई यह काम करते हैं? मेरे कारण ऐसा लगता है कि 'inputCtrl। $ Valid' का मूल्यांकन एक बार किया जाएगा (जब लिंक फ़ंक्शन निष्पादित किया जाता है) और परिणाम' स्कोप। $ Watch' पर पास हो जाता है। तो इसका मतलब यह होगा कि वास्तविक कॉल या तो 'स्कोप' होगा। $ घड़ी (सत्य, हैंडलरफनक) 'या' स्कोप। $ घड़ी (झूठी, हैंडलरफंक) ', जिनमें से दोनों को एक चर दिखाई नहीं दे रहा है। – Tiddo

+0

'inputCtrl। $ मान्य' किसी वस्तु की संपत्ति का संदर्भ है, न कि एक प्राचीन मूल्य। प्रत्येक बार '$ watch' आग लगने पर इसका मूल्यांकन किया जाएगा। मुझे यह व्यक्तिगत परियोजनाओं पर काम कर रहा है, लेकिन वर्तमान में एक अच्छा सार्वजनिक डेमो उपलब्ध नहीं है। – XML

+1

AFAIK 'inputCtrl। $ मान्य' एक आदिम है। यह या तो 'सत्य', 'झूठा' या 'अपरिभाषित' है, जिनमें से सभी प्राइमेटिव हैं। आप ऑब्जेक्ट्स के गुणों के संदर्भ नहीं बना सकते हैं, केवल जावास्क्रिप्ट में ऑब्जेक्ट्स के लिए। यह JSFiddle भी देखें: http://jsfiddle.net/9Mh92/2/। जैसा कि आप देख सकते हैं, आपका कोड कॉलबैक को ट्रिगर नहीं करता है, केवल उद्धरण के साथ। यह फिर से है क्योंकि आप किसी भी आदिम के लिए संदर्भ नहीं बना सकते हैं। 'InputCtrl। $ मान्य 'के आस-पास उद्धरण डालकर आप वर्तमान स्कोप में उस अभिव्यक्ति का मूल्यांकन करने के लिए कोणीय को निर्देश देते हैं, और इस प्रकार यह काम करता है। – Tiddo

12

आप एक <form /> नहीं है, तो आप आसानी से एक मिल सकता है:

अपने निर्देश परिभाषा में:

require: '^form' 

और फिर अपने लिंक समारोह में, प्रपत्र चौथे पैरामीटर के रूप में पारित हो जाता है:

0:
link: function (scope, element, attr, ctrl) { 

अब आप कड़ी मेहनत से कोड के लिए फार्म या $ घड़ी प्रदर्शन करने के लिए इनपुट क्षेत्र की जरूरत नहीं है

scope.$watch(ctrl.$name + '.' + element.attr('name') + '.$valid', 
function (validity) {}); 
+0

यह सही था। हालांकि किसी कारण से मुझे 'ctrl [0]। $ Name' का उपयोग करना पड़ा - यह सुनिश्चित नहीं है कि मेरा नियंत्रण 1 फॉर्म की सरणी क्यों लौटा रहा है ... – DoubleA

+1

यदि 'आवश्यकता' विशेषता एक सरणी पारित की जाती है तो यह एक सरणी वापस कर देगी (मुझे संदेह है कि यह आपके लिए है) – pixelbits

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