Thursday 15 April 2010

angularjs - Angular: $resource update fire PUT request on second call only -


मेरे पास कस्टम अपडेट विधि के साथ एक संसाधन है:

  angular.module ('user । संसाधनों ', [' एनजीआरससोर्स '])। (उपयोगकर्ता '), फ़ंक्शन ($ संसाधन) {var उपयोगकर्ता = $ संसाधन (' / उपयोगकर्ता /: आईडी ', {}, {update: {method:' PUT '}}); User.prototype.update = function Cb) {console.log ('foo'); वापसी उपयोगकर्ता.अपडेट ({id: this._id}, कोणीय एक्सटेंशन। ({}, यह, {_id: undefined}), सीबी);}   

मैं इस संसाधन को गुंजाइश के माध्यम से एक कस्टम निर्देश के पास कर रहा हूं:

  निर्देश ('अवतारउपलोड', फ़ंक्शन ($ http) {वापसी {प्रतिबंधित: 'ई' गुंजाइश: {मॉडल: '='}, ...   

और मैं बीटीएन क्लिक पर निर्देशक नियंत्रक में अद्यतन विधि को बुला रहा हूँ:

  $ Scope.model.update (function () {console.log ('bar');});   

व्यवहार जो मुझे एटीएम पहेली को पहली बार बटन पर क्लिक करना है प्रिंट 'फू' लेकिन 'बार' नहीं, इसे दूसरी बार प्रिंट 'बार' पर क्लिक करने पर फिर 'फू' होता है। कोई और भी हमेशा 'बार' प्रिंट करता है, फिर 'फू'।

PUT अनुरोध केवल दूसरी क्लिक से निकाल दिया और बाद वाले, पहले से कभी नहीं।

नोट: मैं उस संसाधन अद्यतन विधि का उपयोग कर रहा हूँ Trollers, जब तक यह एक निर्देश से कॉल करने की कोशिश कर रहा मैं कोणीय का उपयोग कर रहा हूं 1.1.4 मैं यह संसाधन पारित कर रहा हूं क्योंकि मैं निर्देश को विभिन्न प्रकार के संसाधनों पर काम करना चाहता हूं।

यह सुनिश्चित करना ज़रूरी है कि लाइव कोड उदाहरण देखे बिना, लेकिन मुझे लगता है कि आप 1.1.एक्स श्रृंखला (तथाकथित" अस्थिर शाखा ") से AngularJS का प्रयोग कर रहे हैं। यदि हां, तो आप जिस समस्या का सामना कर रहे हैं, वह अंगुलरजेएस में नई सुविधा से जुड़ा हुआ है - एचटीटीपी अनुरोध इंटरसेप्टर संस्करण 1.1.4 (यह) में पेश किया गया है।

नव शुरू की गई अनुरोध इंटरसेप्टर $ q < कोड> आधारित (वादा-आधारित) और अंगुलर जे एस के विश्व वादों में केवल $ डाइजेस्ट चक्र के भाग के रूप में हल किया जाता है दूसरे शब्दों में आपको वादे के हल के लिए "AngularJS दुनिया" ( $ डाइजेस्ट चक्र) में होना चाहिए।

वादा-आधारित अनुरोध इंटरसेप्टर के साथ एक $ http कॉल किया जा सकता है इससे पहले हल करने का वादा किया गया है। जैसा कि इस वादे से पहले नोट किया गया है जब आप $ डाइजेस्ट चक्र दर्ज करते हैं यह तब नहीं होगा यदि आप AngularJS (डोम ईवेंट, setTimeout आदि) के बाहर से $ http आरंभ कर रहे हैं।

AngularJS $ संसाधन $ http पर आधारित है, इसलिए उपर्युक्त चर्चा $ संसाधन पर भी लागू होती है।

इसलिए, मान लें कि उपरोक्त मान्यताओं सही हैं और आप AngularJS के बाहर से $ संसाधन कॉल की शुरुआत करना (आप एक कस्टम निर्देश के बारे में बात कर रहे हैं, इसलिए मैं किसी DOM ईवेंट पर शर्त लगाऊंगा) आपको $ संसाधन दायरे में कॉल करें। $ लागू करें

कृपया ध्यान दें कि $ संसाधन को कॉलिंग में $ timeout (जैसा कि एक अन्य प्रतिक्रिया में सुझाव दिया गया है), जबकि आपकी समस्या "ठीक" होगी (यह $ डाइजेस्ट लूप को मजबूर करेगी और इस प्रकार वादों का समाधान हो जाएगा) यह सही दृष्टिकोण नहीं है समस्या यह है कि यह एक ब्राउज़र को वर्तमान जावास्क्रिप्ट प्रसंग को छोड़ने के लिए मजबूर करेगी और कुछ भी नहीं के लिए पुन: सन्दर्भ संदर्भ में प्रवेश करेगा। यह आपके एप्लिकेशन को धीमा कर देगा और इसका परिणाम UI चंचल हो सकता है।

No comments:

Post a Comment