11

मैं अपने ऐप में चैट सक्षम करने के लिए socket.io का उपयोग कर रहा हूं और मैं सभी सॉकेट सामग्री को करने के लिए SocketService सेवा का उपयोग कर रहा हूं। जब कोई संदेश आया तो मैं UI में कुछ बदलाव करने के लिए सेवा SocketService से नियंत्रक के फ़ंक्शन को ट्रिगर करना चाहता हूं। तो मैं जानना चाहता हूं कि मैं सेवा से नियंत्रक के फ़ंक्शन को कैसे एक्सेस कर सकता हूं। नमूना कोड:कोणीय में सेवा से कॉल कंट्रोलर फ़ंक्शन

.service('SocketService', function ($http,$rootScope,$q) { 
    this.connect = function(){ 
    var socket = io(); 
    socket.on('connect',function(){ 
     // Call a function named 'someFunction' in controller 'ChatController' 
    }); 
    } 
}); 

इस सेवा के लिए नमूना कोड है।

अब नियंत्रक

.controller('ChatController',function('SocketService',$scope){ 
    $scope.someFunction = function(){ 
    // Some Code Here 
    } 
}); 
+0

[http://stackoverflow.com/questions/20621028/angularjs-calling-a-controller-function-from-a-service][1] [1]: http: //stackoverflow.com/questions/20621028/angularjs-calling-a-controller-function-from-a- सेवा – TechnoCrat

उत्तर

29

के लिए कोड आप कोणीय घटनाओं $broadcast या $emit का उपयोग करके इस लक्ष्य को हासिल कर सकते हैं।

अपने मामले $broadcast में मददगार होगा, आप $rootscope में अपने घटना है कि हो सभी बच्चे स्कोप जो एक ही घटना नाम के साथ $on है द्वारा सुन सकते हैं प्रसारित करने के लिए की जरूरत है।

कोड

.service('SocketService', function($http, $rootScope, $q) { 
    this.connect = function() { 
     var socket = io(); 
     socket.on('connect', function() { 
      // Call a function named 'someFunction' in controller 'ChatController' 
      $rootScope.$broadcast('eventFired', { 
       data: 'something' 
      }); 
     }); 
    } 
}); 


.controller('ChatController', function('SocketService', $scope) { 
    $scope.someFunction = function() { 
     // Some Code Here 
    } 
    $scope.$on('eventFired', function(event, data) { 
     $scope.someFunction(); 
    }) 
}); 

आशा इस तुम्हारी मदद कर सकता, धन्यवाद।

+0

धन्यवाद @ पंकजपाकर $ प्रसारण पूरी तरह से यहां काम किया। –

+0

@VinitChouhan ठंडा, आपकी मदद करने में खुशी हुई, धन्यवाद :) हैप्पी कोडिंग –

+1

@PankajParkar: मेरे मुद्दे के लिए भी इसका सही समाधान है। मेरे मामले में नियंत्रकों को घोंसला नहीं दिया गया था और मुझे दूसरे से अपडेट भेजना पड़ा। यह सिर्फ रंबन इलाज की तरह है। –

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मेरे पास दूसरा विकल्प है। मेरे पास $ प्रसारण के खिलाफ व्यक्तिगत पूर्वाग्रह है - यह बहुत 'कोणीय' महसूस नहीं करता है, मैं अपने कोड में स्पष्ट कॉल करना पसंद करता हूं।

तो नियंत्रक को प्रसारित करने और एक अन्य पाचन चक्र को ट्रिगर करने की बजाय, मैं नियंत्रक को सेवा के रूप में स्वयं सेवा के रूप में पंजीकृत करना पसंद करता हूं। अगर नियंत्रक एक ही सेवा का उपयोग करता है तो बस किसी परिपत्र निर्भरता को पेश न करने के लिए सावधान रहें। यह नियंत्रक के साथ सबसे अच्छा काम करता है सिंटैक्स, ताकि कॉलिंग सेवा को $ स्कोप की देखभाल करने की आवश्यकता न हो।

हां, यह $ प्रसारण से अधिक कोड है, लेकिन यह सेवा को पूरे नियंत्रक तक पहुंच प्रदान करता है - इसकी सभी विधियां और गुण।

.service('SocketService', function ($http,$rootScope,$q) { 
    var _this = this;  
    this.chatController = null; 
    this.registerCtrlr = function (ctrlr) { 
    _this.chatController = ctrlr; 
    }; 
    this.unRegisterCtrlr = function() { 
    _this.chatController = null; 
    }; 

    this.connect = function(){ 
    var socket = io(); 
    socket.on('connect',function(){ 
     // Call chatController.someFunction if chatController exists 
     if (_this.chatController) { 
     _this.chatController.someFunction(); 
     } 
    }); 
    }; 
}); 

.controller('ChatController',['SocketService', '$scope', function(SocketService, $scope){ 
    SocketService.registerCtrlr(this); 
    //-- make sure controller unregisters itself when destroyed - need $scope for this 
    $scope.$on('$destroy', function() { 
    SocketService.unRegisterCtrlr(); 
    }); 
    this.someFunction = function(){ 
    // Some Code Here 
    } 
}]); 
+0

संपूर्ण नियंत्रक क्यों जोड़ें? बस विशिष्ट समारोह की सदस्यता लें। याद रखें कि यदि फ़ंक्शन के अंदर $ स्कोप (या vm) संशोधित किया गया है, तो [$ scope.apply एक wrapper के रूप में] दृश्य में परिवर्तन को सूचित करें (http://jimhoskins.com/2012/12/17/angularjs-and -apply.html) –

+0

कुछ बिंदुओं के साथ अच्छे अंक: ए) विशिष्ट फ़ंक्शन को पंजीकृत करते समय, यह सुनिश्चित करना सुनिश्चित करें कि यह नियंत्रक को इंगित करता है - 'SocketService.registerCtrlrFn (this.someFunction.bind (this)', और बी) यदि सेवा तर्क पहले ही हमेशा पाचन चक्र के हिस्से के रूप में चलता है, तो $ scope.apply wrapper आवश्यक नहीं है। यदि सेवा तर्क एक पाचन चक्र का हिस्सा नहीं है, जैसा कि मूल प्रश्न में है, यह आवश्यक है। यदि यह पाचन चक्र के भीतर हो या न हो, तो इसके बजाय $ टाइमआउट रैपर का उपयोग करें। – grumpyhoser

+0

[$ स्कोप पर अधिक जानकारी।बनाम $ टाइमआउट लागू करें] (http://stackoverflow.com/questions/23070822/angular-scope-apply-vs-timeout-as-a-safe-apply) – grumpyhoser

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