2013-02-07 10 views
30

मैं अपने कोणीय ऐप में एक छोटी सी सेवा लिखने की कोशिश कर रहा हूं जो मुझे वैश्विक जावास्क्रिप्ट ऑब्जेक्ट्स में निर्दिष्ट कॉन्फ़िगरेशन पैरामीटर चुनने में सक्षम करेगा। मैं वैश्विक कॉन्फ़िगरेशन ऑब्जेक्ट तक पहुंचने का प्रयास नहीं करना चाहता जब तक कि दस्तावेज़ तैयार न हो (क्योंकि मैं ऑर्डर की गारंटी नहीं दे सकता जिसमें स्क्रिप्ट तत्व HTML में डाले जाएंगे)।

हालांकि, मुझे समझ में नहीं आ रहा है कि then कॉलबैक के लिए वास्तव में प्रचार करने के लिए मुझे $apply पर कॉल क्यों चाहिए।

myModule.service('GlobalConfigService', ['$q', '$rootScope', function($q, $rootScope) { 
    var def = $q.defer(); 
    $(document).ready(function() { 
     def.resolve(MyConfig.val); 
     $rootScope.$apply(); 
    }); 

    def.promise.then(function() { 
     console.log('I am called only when $apply() is called. Why?'); 
    }); 

    return def.promise; 
}]); 

उत्तर

30

अंगुलरजेएस में संकल्प() के परिणामों को तुरंत $ पाचन चक्र के अंदर, अतुल्यकालिक रूप से प्रचारित किया जाता है। इसका मतलब है कि तब() के साथ पंजीकृत कॉलबैक केवल (बाद में) कहा जाता है जब एक पाचन चक्र होता है।

आपके कोड में, कुछ भी कोणीय को पाचन चक्र में प्रवेश करने का कारण नहीं बना रहा है, इसलिए तब() कॉलबैक कभी नहीं कहा जाता है। कॉलिंग $ लागू() एक पाचन चक्र चलाने के लिए एक तरीका है। एक और तरीका है: एनजी-क्लिक के साथ एक बटन जोड़ने के लिए कुछ भी नहीं, उसके बाद है कि, यह एक डाइजेस्ट चक्र का कारण होगा और आप परिणाम दिखाई देंगे:

<button ng-click="">Force digest by clicking me</button> 

भी देखें https://stackoverflow.com/a/14657974/215945

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