2012-09-17 18 views
76

एक बात है कि अन्य जावास्क्रिप्ट-MVC चौखटे से AngularJS अलग करता है यह HTML का उपयोग कर बाइंडिंग में जावास्क्रिप्ट से बाध्य मूल्यों गूंज की क्षमता है। जब आप $ स्कोप वैरिएबल को कोई मान निर्दिष्ट करते हैं तो कोणीय यह "स्वचालित रूप से" करता है।कोणीयजेएस में बाध्यकारी और पचाने का काम कैसे करता है?

लेकिन यह कितना स्वचालित है? कभी-कभी, कोणीय परिवर्तन पर नहीं उठाएगा, इसलिए मुझे $ स्कोप कॉल करने की आवश्यकता है। परिवर्तन को पिकअप करने के लिए कोणीय को सूचित करने के लिए $() या $ scope। $ Digest() लागू करें। कभी-कभी जब मैं उन तरीकों में से किसी एक को चलाता हूं तो यह एक त्रुटि फेंकता है और कहता है कि एक पाचन पहले ही प्रगति पर है।

बाइंडिंग ({{}} ब्रेसिज़ या एनजी-एट्रिब्यूट्स के अंदर कुछ भी) eval के साथ प्रतिबिंबित होने के बाद से इसका मतलब यह है कि कोणीय लगातार परिवर्तनों को देखने के लिए $ स्कोप ऑब्जेक्ट को मतदान कर रहा है और फिर उन परिवर्तनों को धक्का देने के लिए एक eval प्रदर्शन कर रहा है डोम/एचटीएमएल के लिए? या AngularJS ने किसी भी तरह से जादू चर का उपयोग किया है जो घटनाओं को आग लगती है जो परिवर्तनीय मान बदलते हैं या असाइन किए जाते हैं? मैंने कभी भी यह नहीं सुना है कि यह सभी ब्राउज़रों द्वारा पूरी तरह से समर्थित है, इसलिए मुझे शक है।

एंगुलरजेएस इसके बाइंडिंग और स्कोप चर के ट्रैक कैसे रखता है?

+5

मुझे http://docs.angularjs.org/guide/concepts#runtime में अनुभाग मिला जो "हैलो वर्ल्ड उदाहरण डेटा-बाइंडिंग प्रभाव को कैसे प्राप्त करता है" के बारे में स्पष्टीकरण देता है। –

+3

यह पोस्ट भी उपयोगी है अगर आपने इसे अभी तक नहीं देखा है: http://stackoverflow.com/questions/9682092/databinding-in-angularjs/9693933#9693933 – Gloopy

+0

आपके पहले घोषणात्मक अनुच्छेद पर टिप्पणी: कोणीय की "प्रतिध्वनि प्रतिबिंबित करने की क्षमता बाइंडिंग का उपयोग कर जावास्क्रिप्ट से एचटीएमएल में मूल्य "डेटा बाध्यकारी" कहने के लिए एक भ्रमित तरीके की तरह लगता है "। और इस समय पर यह वास्तव में एम्बर या प्रतिक्रिया जैसे अन्य ढांचे के अलावा कोणीय सेट नहीं करता है। सवाल उपयोगी है, मुझे गलत मत समझो। लेकिन उस पहले पैराग्राफ सिर्फ एक राय है जो मैं से असहमत होता है है - मैं प्रश्न संपादित करनी होगी लेकिन मैं पर्याप्त आधिकारिक महसूस नहीं करते। –

उत्तर

64

मार्क I द्वारा पाया गया documentation section के अलावा हम सोचते हैं कि हम परिवर्तन के सभी संभावित स्रोतों का आकलन करने का प्रयास कर सकते हैं। एचटीएमएल जानकारी के साथ

  1. उपयोगकर्ता सहभागिता ('text', 'number', 'url', 'email', 'radio', 'checkbox')। AngularJS में inputDirective है। 'पाठ', 'संख्या', 'url' और 'ईमेल' आदानों 'इनपुट' या 'keydown' की घटनाओं के लिए listener handler बाँध। श्रोता हैंडलर calls scope.$apply। 'रेडियो' और 'चेकबॉक्स' क्लिक ईवेंट के लिए समान हैंडलर बांधें।
  2. चयन तत्व के साथ उपयोगकर्ता सहभागिता। AngularJS में 'परिवर्तन' ईवेंट पर समान व्यवहार के साथ selectDirective है।
  3. $timeout service का उपयोग करके आवधिक परिवर्तन जो $rootScope.$apply() भी करते हैं।
  4. eventDirectives (एनजीक्लिक, आदि) scope.$apply का भी उपयोग करते हैं।
  5. $ http भी $rootScope.$apply() उपयोग करता है। AngularJS दुनिया के बाहर
  6. परिवर्तन गुंजाइश का उपयोग करना चाहिए। $ जैसा कि आप जानते लागू होते हैं।
+2

बिंदु के +1 "5। $ http $ rootScope का भी उपयोग करता है। $ लागू()। " अरे। क्या कोई जानता है कि वे ऐसा क्यों करते हैं? यह बहुत परेशान है ... – gecco

5

जैसा कि आपने पाया कि यह मतदान नहीं है, लेकिन इसका आंतरिक निष्पादन लूप का उपयोग कर रहा है, इसलिए आपको गति को गति में लाने के लिए $() या $ digest() का उपयोग करने की आवश्यकता है।

Miško's explanation काफी गहन है, लेकिन थोड़ा गुम है कि एंगुलर सिर्फ अपने दायरे में कुछ भी होने पर $ स्पष्ट क्षेत्र को वापस लाने की कोशिश कर रहा है। यह लग सकता है काफी कुछ मॉडल राज्यों के बीच चारों ओर उछल, ताकि और इसी कारण आप $ घड़ी पर भरोसा नहीं कर सकते() है केवल एक बार फायरिंग और भी कारण है कि आप मैन्युअल रूप से मॉडल के बीच संबंधों की स्थापना या आप अनंत में पहुंच जाएंगे साथ सावधान रहना चाहिए परिपत्र रिफ्रेश

+0

तो $ कैसे लागू होता है (कुछ एफएन) काम करता है? आवेदन लागू होने पर कुछ एफएनएन की सामग्री निष्पादित की जाएगी? – matsko

+0

$ कोड लागू के साथ कोणीय गुंजाइश, जो सिर्फ यह सूचित करने के लिए है कि आप चाहते हैं पच जाने वाले परिवर्तनों है में मार डाला जाता है, देखें: http://docs.angularjs.org/api/ng.$rootScope.Scope#$ – dain

+0

लागू मामले में आप $ के साथ टकराने को पचाने को रोकने के लिए चाहते हैं, आप $ चरण के लिए जाँच करने के लिए है: https://groups.google.com/d/msg/angular/FJwxJ-XbJaE/1NavZNQBhf4J – dain

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