angularjs 没有使用 $rootscope 和 $broadcast

angularjs not using $rootscope and $broadcast

所以基本上我正在尝试找到一种方法来防止使用 $rootscope、$broadcast 和 $apply。先给大家看一下代码:

         app.controller('firstController', function ($scope, ServiceChatBuddy, socketListeners){ 

            $scope.ChatBuddy = ServiceChatBuddy;
            $scope.$on('user delete:updated', function (event, id) {
                $scope.ChatBuddy.users[id]['marker'].setMap(null);
                delete $scope.ChatBuddy.users[id];
            });
            $scope.$on('loadPosition:updated', function (event, data) {
                $scope.$apply(function () {
                    $scope.ChatBuddy.users[data.id] = data.obj;
                });
             // and a bunch more like these
            });
          })

socketListeners 是一个第 3 方库(socket.io),我在一个工厂中实现了它,它将在事件发生时广播数据

      socketModule.factory('socketListeners', function ($rootScope, decorateFactory) {
          var sockets = {};
          var socket = io.connect('http://localhost:8000');
          sockets.listen = function () {
                socket.on('loadPosition', function (data) {
                    $rootScope.$broadcast('loadPosition:updated', data)
            });
            socket.on('client leave', function (id) {
                $rootScope.$broadcast('user delete:updated', id);
            });
            // and a bunch more of these
       });

如您所见,代码存在很多 $rootscope $broadcasts 和 $apply;

所以我正在努力寻找一种方法来更多地做到这一点 'professional'。绝对欢迎任何提示技巧最佳实践!干杯

试试这个 https://github.com/btford/angular-socket-io

socket.js(服务)

angular.module('app')
.service('socket', function (socketFactory) {
    var socket = io.connect('http://localhost:8000');

    var mySocket = socketFactory({
        ioSocket: socket
    });

    return mySocket;
});

firstController.js

app.controller('firstController', function ($scope, socket){

    socket.forward('user delete:updated', $scope);
    socket.forward('loadPosition:updated', $scope);

    $scope.$on('user delete:updated', function (event, id) {
        $scope.ChatBuddy.users[id]['marker'].setMap(null);
        delete $scope.ChatBuddy.users[id];
    });
    $scope.$on('loadPosition:updated', function (event, data) {
        $scope.$apply(function () {
            $scope.ChatBuddy.users[data.id] = data.obj;
        });
        // and a bunch more like these
    });
});

作用域被销毁时,侦听器也会被销毁:)