Call controller function from service in angularjs

前端 未结 3 1857

I am using socket.io to enable chat in my app and i am using a service SocketService to perform all the socket stuff. When a message came then i want to trigger

相关标签:
3条回答
  • 2020-12-31 07:34

    I realize this post is old but I'd like to give my two cents after dealing with Angular JS for several years. I personally would reconsider this approach. Ideally with AngularJS you'd modify your controller/directive to facilitate transferring data to the view model and ultimately bind an HTML template to what I call "the user friendly" view model. This view model should simply reflect what you want the user to see and when in general. Using this method the moment connect event happens your view model which should be bound to the service's data will reflect changes to the data the moment the data arrives.

    0 讨论(0)
  • 2020-12-31 07:48

    I know this is an old question, but I have another option. I have a personal bias against $broadcast - it just doesn't feel very 'angularish', I prefer making explicit calls in my code.

    So instead of broadcasting to the controller and triggering another digest cycle, I prefer to have the controller register itself to the service, as below. Just be careful not to introduce any circular dependencies if the controller makes use of the same service. This works best with the controllerAs syntax, so that the calling service does not need to care about $scope.

    Yes, this is more code than $broadcast, but it does give the service total access to the entire controller - all of it's methods and properties.

    .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 讨论(0)
  • 2020-12-31 07:50

    You could achieve this by using angular events $broadcast or $emit.

    In your case $broadcast would be helpful, You need to broadcast your event in $rootscope that can be listen by all the child scopes which has $on with same event name.

    CODE

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

    Hope this could help you, Thanks.

    0 讨论(0)
提交回复
热议问题