2015-03-17 6 views
5

मैं कुछ विजेट को फैक्टरिंग कर रहा हूं और $watch अभिव्यक्ति पूरी तरह से एक फ़ाइल में सभी काम करती है लेकिन अब मैंने प्रासंगिक नियंत्रक भाग को एक नए नियंत्रक में स्थानांतरित किया है और मार्कअप को एक नए एचटीएमएल में बदल दिया है और $watch प्रारंभिक के ठीक बाद एक बार आग लगती है लेकिन जब नहीं संबंधित इनपुट में टाइपिंग संपादन।

जे एस:

app.controller('getRecipientWidgetController', [ '$scope', function($scope) { 
    console.log("controller initializing") 
    var testReceivingAddress = function(input) { 
     console.log("change detected") 
    } 
    $scope.$watch("addressInput", testReceivingAddress) 
} ]) 

आवरण के HTML:

<ng-include 
    src="'partials/getRecipientWidget.html'" 
    ng-controller="getRecipientWidgetController" 
    ng-init="recipient=cert"> <!-- ng-init doesn't influence the bug. --> 
</ng-include> 

partials/getRecipientWidget.html के HTML:

<md-text-float ng-model="addressInput"></md-text-float> 

मुझे लगता है कुछ गुंजाइश वूडू चल रहा है? मैंने यह सुनिश्चित करने के लिए ng-init छोड़ा है कि मैं क्या हासिल करना चाहता हूं: एक स्पष्ट रूप से अधिक जटिल, पुन: प्रयोज्य विजेट बनाएं जो इस उदाहरण में $scope.cert पर recipient पर काम करेगा।

+0

प्रयास करें, क्या होता है जब आप rootscope इंजेक्षन और $ फोन उस पर देखते हैं? – lintmouse

+0

@ डस्टमाउस कोई बदलाव नहीं। बिल्कुल वही बग/व्यवहार। – Giszmo

+0

जैसा कि फ्लोरिबोन ने अपने उत्तर में कहा था, तथाकथित "डॉट नियम" के बारे में जानें। – Blackhole

उत्तर

7

शायद ऐसा इसलिए है क्योंकि ng-include शामिल एचटीएमएल पर एक नया विरासत में मिला गुंजाइश पैदा करेगा, इसलिए $scope.addressInput अपने नियंत्रक में getRecipientWidget.html

में $scope.addressInput रूप में एक ही संदर्भ खैर यह आसान नहीं है समझाने के लिए नहीं है, लेकिन आप या तो रखना चाहिए ng-controllergetRecipientWidget.html (और ऊपर दिए गए div पर नहीं) के HTML के भीतर, या आप कच्चे प्रकार (संख्या/स्ट्रिंग) पर संदर्भ मुद्दों से बचने वाले कच्चे addressInput के बजाय something.addressInput जैसे किसी ऑब्जेक्ट का उपयोग कर सकते हैं।

+0

हाँ! एक टन धन्यवाद! 'कुछ' यहाँ काम करना शुरू कर दिया। :) सुनिश्चित नहीं है कि आपके कौन से समाधान चुनने हैं लेकिन पसंद होने से मेरी बग की तुलना में एक अच्छी समस्या है :) – Giszmo

+0

दूसरा चुनें। डॉट नोटेशन का उपयोग एंगुलरजेएस में सबसे अच्छा अभ्यास के रूप में देखा जाता है, और यह लगातार करने का मतलब है कि आपको यह बग आपको वापस करने के लिए वापस नहीं आएगा (या आपका एक सहयोगी जो HTML को बदल देगा) – Greg

+0

मैंने अभी पहले परीक्षण किया है और सीखा (आप अपने उत्तर में विस्तृत/जोड़ सकते हैं) कि दोनों नियंत्रक एक ही दायरे पर परिचालन समाप्त कर चुके हैं। 'कुछ' और दो scopes (?) के साथ जाना होगा। – Giszmo

3

एनजी-शामिल नए स्कोप बनाता है।

इस

<md-text-float ng-model="$parent.addressInput"></md-text-float> 

Plunker example

बस गिगल्स के लिए
+0

धन्यवाद लेकिन मुझे लगता है कि फ्लोरिबोन ने समझाते हुए एक अच्छा काम किया क्या चल रहा है। '$ Parent' का उपयोग करना शायद तीसरा विकल्प होगा। – Giszmo

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