11

Uygulamamdaki sohbeti etkinleştirmek için socket.io kullanıyorum ve tüm soket malzemelerini gerçekleştirmek için SocketService hizmetini kullanıyorum. Bir mesaj geldiğinde, UI'de bazı değişiklikler yapmak için SocketService servisinden bir kontrolörün fonksiyonunu tetiklemek istiyorum. Yani bir denetleyicinin işlevine hizmetten nasıl erişebileceğimi bilmek istiyorum. Örnek Kod:Angularjs hizmetinden çağrı denetleyicisi işlevi

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

Bu hizmet için örnek kod verilmiştir. kontrolörün

.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-service – TechnoCrat

cevap

29

için

Şimdi kod Sen açısal olayları $broadcast veya $emit kullanarak bunu başarabilir. Senin durumunda $broadcast yılında

yararlı olacaktır, Aynı etkinlik adıyla $on sahiptir tüm alt kapsamları ile dinlemek edilebilir $rootscope daki olayı yayınlayan gerekiyor. Bu size yardımcı olabilecek

KOD

.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(); 
    }) 
}); 

Umut, teşekkürler.

+0

Teşekkürler @pankajparkar $ yayını burada mükemmel çalıştı. –

+0

@VinitChouhan havalı, Size yardımcı olmaktan mutluluk, Teşekkürler :) Mutlu Kodlama –

+1

@PankajParkar: Sorunum için de mükemmel bir çözüm. Benim durumumda kontrolörler iç içe değildi ve güncellemeyi diğerine göndermek zorunda kaldım. Tıpkı Ramban Ilaaj gibi. –

1

Bunun eski bir soru olduğunu biliyorum, ama başka seçeneğim var. $ Yayına karşı kişisel bir önyargı var - sadece 'çok açılı' hissetmiyor, kodumda açık çağrı yapmayı tercih ediyorum. Bu nedenle, denetleyiciye yayınlamak ve başka bir sindirim döngüsünü tetiklemek yerine, denetleyicinin kendisini aşağıdaki gibi hizmete kaydettirmesini tercih ediyorum. Kontrol cihazının aynı servisi kullanması durumunda, herhangi bir yuvarlak bağımlılığı tanıtmamaya dikkat edin. Bu, controllerAs sözdizimi ile en iyi şekilde çalışır, böylece arama servisinin $ kapsamını önemsemesi gerekmez.

Evet, bu, $ yayınından daha fazla koddur, ancak tüm denetleyiciye hizmetin toplam erişimini verir - tüm yöntemleri ve özellikleri.

.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

Neden tüm denetleyiciyi ekleyin? Sadece belirli işlevi abone. $ Scope (veya vm) işlevinin değiştirilmiş olması durumunda, [$ scope.apply bir sarıcı olarak] görünümündeki değişikliği bildirmesi gerektiğini unutmayın (http://jimhoskins.com/2012/12/17/angularjs-and -apply.html) –

+0

Bir kaç uyarıyla birlikte iyi noktalar: a) belirli bir işlevi kaydederken, denetleyicinin bağlı olduğunu belirttiğinizden emin olun - 'SocketService.registerCtrlrFn (this.someFunction.bind (this)' ve b) Servis mantığı zaten her zaman bir sindirim döngüsünün bir parçası olarak çalışıyorsa, $ scope.apply sarıcısı gerekli değildir. Servis mantığı, asıl sorudaki gibi bir sindirim döngüsünün parçası değilse, gereklidir. Bir özet döngüsünde olabilir veya olmayabilirse, bunun yerine bir $ timeout sarıcı kullanın. – grumpyhoser

+0

Daha fazla bilgi için [$ scope.vs $ timeout uygulayın (http://stackoverflow.com/questions/23070822/angular-scope-apply-vs-timeout-as-a-safe-apply) – grumpyhoser