दो-तरफा बंधन तत्वों कि ng-model
उपयोग करने के लिए लगभग विशेष रूप से सीमित है। दृश्य से मॉडल में जाने वाली दिशा मॉडल के भीतर अपडेट किए जाने वाले परिवर्तनों का पता लगाने के लिए मानक ईवेंट हैंडलर का उपयोग करती है (उदा।, onchange
)। मॉडल से वापस देखने की दिशा $digest
के दौरान अपडेट की गई है। लेकिन हम सीधे $digest
पर कॉल नहीं करते हैं।
पाचन चक्र का जवाब देने के लिए आपके पृष्ठ पर मौजूद प्रत्येक तत्व, कहीं भी श्रोता और $watch
का उपयोग करके अपने दायरे को अभिव्यक्ति करेगा। जब आप {{ foo() }}
लिखते हैं, या जब आप ng-model='user.name'
उपयोग करते हैं, आंतरिक रूप से वहाँ $watch
के लिए एक कॉल एक जावास्क्रिप्ट अभिव्यक्ति है कि हर बार एक डाइजेस्ट चक्र चलाया जाता है चलाया जाएगा साथ अपनी ओर से किया जाता है।यह पंजीकरण टेम्पलेट (हमारे पहले उदाहरण) के संकलन के दौरान हो सकता है, या यह निर्देश के लिंक चरण (हमारे दूसरे) के दौरान हो सकता है।
यहां कोई जादू नहीं है। जुड़े हुए श्रोताओं नियमित कार्य होते हैं - हमारे उदाहरण में, foo()
अभिव्यक्ति के लिए श्रोता आपके लिए प्रदान किया जाता है, और यह पृष्ठ पर HTML टेक्स्ट अपडेट करेगा, जबकि user.name
अभिव्यक्ति के श्रोता setText
, या setOption
पर कॉल करेंगे, या जो विशेष इनपुट द्वारा आवश्यक है ng-model
संलग्न किया गया है।
जबकि कोणीय अधिकांश सुनने को संभाल सकता है, आप अपने स्वयं के श्रोताओं के साथ अपने स्वयं के श्रोताओं को मैन्युअल रूप से किसी भी फ़ंक्शन के अंदर संलग्न कर सकते हैं, जो किसी दायरे तक पहुंच है (गुंजाइश महत्वपूर्ण है क्योंकि हम उन हिस्सों को फाड़ देंगे यदि संबंधित भाग पृष्ठ हटा दिया गया है)। अधिक ध्यान रखें। बाइंडिंग मुक्त नहीं हैं, और अधिक चीजें जो बाध्य हैं, धीमे पृष्ठ का जवाब देगा। एक बार बाइंडिंग इस लागत को कम करने का एक तरीका है। $on
$emit
और $broadcast
के साथ 0 का उपयोग कर रहे हैं।
तो कब पाचन कहा जाता है? यह निश्चित रूप से स्वचालित नहीं है। यदि पाचन चक्र चल रहा है, तो इसका मतलब है कि किसी को कहीं भी $apply
को उनके दायरे या रूट दायरे पर बुलाया जाता है। ng-model
हैंडलर को जोड़ता है जो नियमित एचटीएमएल कार्यक्रमों का जवाब देंगे और आपकी ओर से $apply
पर कॉल करेंगे। लेकिन foo()
, दूसरी तरफ, कभी भी कॉल नहीं किया जाएगा जब तक कि कुछ अन्य स्क्रिप्ट कहीं भी $apply
पर कॉल न करें। सौभाग्य से, जिन कार्यों को आप कोणीय के लिए भरते हैं, वे $apply
पर कॉल के साथ उन कार्यों को लपेटते हैं, इसलिए आपको अक्सर कॉल करना नहीं पड़ता है (उदाहरण के लिए, $timeout
$apply
के साथ लपेटा गया है, यही कारण है कि हम इसे setTimeout
के बजाय उपयोग करते हैं) । लेकिन अगर आप कोणीय के दायरे से बाहर कुछ उपयोग कर रहे थे (एक तृतीय पक्ष लाइब्रेरी जो घटनाओं से जुड़ती है), तो आपको $apply
स्वयं को कॉल करना याद रखना होगा, और बस ऊपर की तरह, आप कहीं भी $apply
पर कॉल करके इसे मैन्युअल रूप से एक्सेस कर सकते हैं एक गुंजाइश के लिए।