2015-04-17 16 views
7

अंदर केवल एक बार फायरिंग कर रहा है मैं कोणीय जे एस के लिए नया हूँ, इसलिए कृपया कुछ भी मुझे है.मैं मदद मेरी यहाँ टेम्पलेट है:

<form ng-model="signup" form-valid> 
    <input type="text" name="username" ng-model="signup.username">{{signup}} 
</form> 

और मेरे निर्देश इस तरह है:

app.directive("formValid",function(){ 

return { 
    restrict:"A", 
    require:"ngModel", 
    link:function(scope,element,attrs){ 
      scope.$watch(attrs.ngModel,function(newValue){ 
       if(newValue){ 
       console.log(newValue); 
       } 
      }); 
     } 
    }}); 

जब भी मैं टेक्स्ट बॉक्स में कुछ मूल्य डाल रहा हूं तो मॉडल बदल रहा है और तदनुसार "$ घड़ी" निकाल दिया जाना चाहिए। लेकिन यहां "$ घड़ी" को केवल एक बार निकाल दिया जाता है जब पहली बार मैं टेक्स्ट बॉक्स में कोई मान डालता हूं ।अग्रिम में धन्यवाद।

+1

आप शायद अपने मॉडल के गुणों को देखना चाहते हैं, न केवल ऑब्जेक्ट स्वयं: 'स्कोप। $ Watch (attrs.ngModel, {...}, true); ' – Blackhole

+0

यह मेरे लिए काम करता है। वह तीसरा तर्क क्या है" सच "कर रहा है। बिना" सत्य "के बिना यह केवल एक बार फायरिंग था। – Nitya

+0

तीसरा तर्क "गहरा" देखना है या नहीं। उदाहरण के लिए एक ही ऑब्जेक्ट की जांच करें या ऑब्जेक्ट की जांच करें सभी ऑब्जेक्ट्स/मान – dogmatic69

उत्तर

-1

एक समाधान नीचे दिए गए उदाहरण में ngModel का उपयोग करना होगा।

app.directive("formValid",function(){ 
    return { 
    restrict: 'A', 
    require: 'ngModel', 
    link: function(scope, element, attrs, ngModel) { 
     scope.$watch(function() { 
      return ngModel.$modelValue; 
     }, function(newValue) { 
      console.log(newValue); 
     }); 
     } 
    } 
    }); 

संपादित करें: तेज समाधान ब्लैकहोल द्वारा टिप्पणी का पालन करें और true जोड़कर एक गहरी नजर के लिए अपनी घड़ी को अद्यतन करने के लिए होगा। ऐसा इसलिए है क्योंकि आप signup विशेषता देख रहे हैं लेकिन मॉडल मान username साइनअप की एक संपत्ति है। गहरी घड़ी संपत्तियों को देखने के लिए काम करेगा।

का उपयोग attrs के माध्यम से सीधे या स्वरूपक या पार्सर्स के माध्यम से (जैसा कि माइकल्स उत्तर में विस्तृत है मेरे दृश्य में एक बेहतर समाधान है)।

+1

ओपी 'attrs.ngModel', अर्थात् 'साइनअप' की सामग्री देख रहा है, जो विरासत द्वारा एक स्कोप चर है। – Blackhole

+0

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

+0

धन्यवाद Asta.I ने वॉचर को "सत्य" जोड़ा। अब यह काम कर रहा है – Nitya

3

जब आप ngModelController उपयोग करते हैं, मॉडल पर परिवर्तन देखने के लिए मानक तरीका एक formatter बनाने के द्वारा है:

link: function(scope, element, attrs, ngModelCtrl) { 
    ngModelCtrl.$formatters.push(function(value) { 
     // Do something with value 
     return value; 
    }); 
} 

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

ngModelCtrl.$parsers.push(function(value) { 
    // Do something with value 
    return value; 
}); 

Working Plunker

मेरा सुझाव है कि आप ngModelController दस्तावेज़ पढ़ें ताकि आप समझ सकें कि कैसे उन पाइपलाइनों काम करते हैं।

लेकिन जब मॉडल परिवर्तन (यदि आप नहीं चाहते या न प्रारूप करने की जरूरत है और न ही कुछ पार्स), तो आप सरल कुछ कर सकते हैं अगर सभी आप क्या करना चाहते सूचित किया जाता है:

scope: { model: '=ngModel' }, 
link: function(scope) { 
    scope.$watch('model', function(value) { 
     // Do something with value 
    }); 
} 

Working Plunker

लेकिन आपके निर्देश का नाम, formValid, मुझे लगता है कि ngModelController का उपयोग सही दृष्टिकोण है।

अद्यतन

यह ngModelController यकीनन कमी है कि उल्लेख के लायक है: यह "संदर्भ" प्रकार (उदा सरणियों, वस्तुओं) के साथ बहुत अच्छी तरह से काम नहीं करता। उस पर अधिक जानकारी here मिल सकती है।

+0

धन्यवाद माइकल.लेकिन एक बात मैं जानना चाहूंगा। पल मैंने वॉचर को "सच" के रूप में एक तीसरा पैरामीटर जोड़ा, जिसने मॉडल को देखना शुरू कर दिया। लेकिन पहले क्यों यह केवल एक बार फायरिंग कर रहा था? नीचे दिया गया कोड मेरे लिए काम करता है गुंजाइश। $ घड़ी ('मॉडल', फ़ंक्शन (मान) { // मूल्य } के साथ कुछ करें, सत्य); – Nitya

+0

@Nitya वह तीसरा तर्क मूल्यों की तुलना करने के लिए कोणीय को 'angular.equals' का उपयोग करने के लिए कहता है (यानी यह एक गहरी तुलना करता है)। इसलिए यदि आपको किसी ऑब्जेक्ट की निगरानी करने की आवश्यकता है और इसकी एक विशेषता में परिवर्तन होने पर अधिसूचित होना आवश्यक है, तो आपको उस पैरामीटर को सेट करने की आवश्यकता है (कुछ प्रदर्शन के बदले में)। यह 'ngModelController' की एक कमी है: यह उस तरह की तुलना नहीं करता है और इसलिए" मूल्य प्रकार "के साथ बेहतर काम करता है। –

+0

@Nitya घड़ी केवल फायरिंग के बारे में, एक बार उम्मीद है। प्रत्येक घड़ी कम से कम एक बार चलती है (अपरिभाषित तर्कों के साथ, यदि संपत्ति देखी जा रही है तो इसका कोई मूल्य नहीं है), जैसा कि आप [इस प्लंकर] में देख सकते हैं (http://plnkr.co/edit/2qWMhOkTSH403i6k0ti0?p=preview)। –

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