2014-05-21 5 views
8

मैं AngularJS के लिए नया हूँ और एक सेवा है कि मेरी प्रारंभिक उपयोगकर्ता विन्यास लोड करता हैAngularJS अन्य कार्यों से पहले सेवा समारोह चलाने

angular.module('myApp').service('myService', ['$http', function ($http) { 
    var self = this; 
    self.user = {}; 

    self.loadConfiguration = function() { 
     $http.get('/UserConfig').then(function (result) { 
      self.user = result.data; 
     }); 
    }; 

    self.loadConfiguration(); 
}]); 

मैं एक नियंत्रक इस सेवा

angular.module('myApp').controller('myController', ['$scope', 'myService', function ($scope, myService) { 
    var self = this; 

    // calculation based on service value 
    self.something = myService.user.something * something else; 
}]); 

से विन्यास का उपयोग करता है यहां समस्या यह है कि myService.user.something को अपरिभाषित किया जा सकता है क्योंकि AJAX अनुरोध पूरा होने पर यह कोड पूरा नहीं हो सकता है। क्या कोई अन्य कोड चलाने से पहले सेवा पूरी करने का कोई तरीका है? मैं सेवा फ़ंक्शन 'लोड कॉन्फ़िगरेशन' को केवल एक बार चलाने के लिए चाहता हूं चाहे इस पर निर्भर नियंत्रकों की संख्या के बावजूद।

उत्तर

5

यदि आप यह सुनिश्चित करना चाहते हैं कि आपके एजेक्स कॉल रिटर्न के बाद नियंत्रक में आपका कोड निष्पादित हो जाए, तो आप ईवेंट का उपयोग कर सकते हैं।

आपकी सेवा में इस का उपयोग करें:

angular.module('myApp').service('myService', ['$http', '$rootScope', function ($http, $rootScope) { 
    var self = this; 
    self.user = {}; 

    self.loadConfiguration = function() { 
     $http.get('/UserConfig').then(function (result) { 
      self.user = result.data; 
      $rootScope.$broadcast('myService:getUserConfigSuccess'); 
     }); 
    }; 

    self.loadConfiguration(); 
}]); 

अपने नियंत्रक में:

angular.module('myApp').controller('myController', ['$scope', 'myService', function ($scope, myService) { 
    var self = this; 

    $scope.$on('myService:getUserConfigSuccess', function() { 
     // calculation based on service value 
     self.something = myService.user.something * something else; 
    }) 
}]); 

तुम भी घटना के लिए एक वस्तु संलग्न कर सकते हैं।

कृपया https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope देखें।

+1

आपका उत्तर ज्यादातर काम करता है। यह तब काम नहीं करता है जब नियंत्रक प्रारंभ होने से पहले सेवा लोड हो चुकी है क्योंकि तब $ स्कोप। $ ('MyService: getUserConfigSuccess') कभी भी आग नहीं लगेगी। –

+0

@ उपयोगकर्ता 1 अहह, हाँ! इसलिए यदि आप सुनिश्चित करना चाहते हैं, तो आप या तो अपने नियंत्रक से 'लोड कॉन्फ़िगरेशन()' को कॉल कर सकते हैं, या नियंत्रक में पहले से लोड होने वाले उपयोगकर्ता '(यदि हां, इसका उपयोग करें; यदि नहीं, तो ईवेंट श्रोता जोड़ें) की जांच जोड़ें। –

+0

हां, यही वह है जो मैंने किया। :) मैं अब से कई महीनों को पढ़ने में मदद करने के लिए स्वीकार किए गए उत्तर की कमी का रिकॉर्ड छोड़ना चाहता था। –

5

आप .run() समारोह के अंदर आपकी सेवा विधि कॉल कर सकते हैं

भागो ब्लाकों

भागो ब्लॉक मुख्य विधि के कोणीय में निकटतम बात कर रहे हैं। एक रन ब्लॉक वह कोड होता है जिसे एप्लिकेशन किकस्टार्ट करने के लिए चलाने की आवश्यकता होती है। यह सेवा निष्पादित की गई है कि सभी सेवा कॉन्फ़िगर की गई हैं और इंजेक्टर बनाया गया है। रन ब्लॉक आमतौर पर में कोड होता है जो यूनिट-टेस्ट के लिए कठिन होता है, और इस कारण से अलग मॉड्यूल में घोषित किया जाना चाहिए, ताकि उन्हें यूनिट-परीक्षणों में अनदेखा किया जा सके।

https://docs.angularjs.org/guide/module

angular.module('myApp').run(function()){ 
    //use your service here 
} 

एक तरह से ajax देरी से निपटने के लिए, $ http.success जो सभी नियंत्रकों के लिए अपने कस्टम घटना का प्रसारण किया जाएगा पर $rootScope.$broadcast() समारोह का उपयोग करें। Antoher तरीका वादे का उपयोग करने और संकल्प के बाद नियंत्रकों में कार्रवाई करने के लिए है। यहां कुछ विचार दिए गए हैं: https://groups.google.com/forum/#!topic/angular/qagzXXhS_VI/discussion

+0

सर्वश्रेष्ठ विकल्प! ^^ सहायता के लिए धन्यवाद :) –

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