socket.emit仅适用于一个控制器AngularJS

时间:2017-08-06 23:49:02

标签: angularjs node.js socket.io

嘿伙计们我遇到了一个奇怪的问题。我的socket.emit正在为我的一个控制器工作,但它对另一个控制器不起作用。

  

server.js(服务器端)

io.sockets.on('connection', function(socket){
  console.log('User ' + socket.id + ' connected');
  socket.emit('test');
});
  

QueueController.js(客户端)(工作)

app.controller('QueueController', ['$scope', '$location', '$rootScope', 'socket',
    function($scope, $location, $rootScope, socket){

    socket.on('chat start', function(data){
        $rootScope.$apply(function(){
            $location.path('/chat');
        });
    });

    socket.on('test', function(){
        console.log('hello world'); //this displays fine in the console
    });
});
  

ChatController(客户端)(不工作)

app.controller('ChatController', ['$scope', '$rootScope', 'socket', 
    function($scope, $rootScope, socket){

    socket.on('test', function(){       
        console.log('hello world'); //this does not display at all  
    });
});

我已经读过需要将socket.emit包裹在

socket.on('connect', function(){ ... },但那不起作用。

这些是我的路线:

  

app.js

var app = angular.module('ChatApp', ['ngRoute', 'ngAnimate', 'luegg.directives', 'btford.socket-io']);

app.config(function($routeProvider, $locationProvider){
    $routeProvider
    .when('/', {
        controller:'HomeController',
        templateUrl:'views/home.html'
    })
    .when('/queue', {
        controller:'QueueController',
        templateUrl:'views/queue.html'
    })
    .when('/chat', {
        controller:'ChatController',
        templateUrl:'views/chat.html'
    })
    .otherwise({
        redirectTo: '/'
    });
});

任何想法有什么不对?

1 个答案:

答案 0 :(得分:0)

在您的情况下,这主要是范围问题。在路由配置中,每个控制器都定义为拥有顶级范围的控制器。当您更改页面时,顶级示波器控制器将一起切换。

一种解决方法是构建一个将在所有页面中使用的控制器,例如MasterCtrl或RootCtrl。然后,您可以将该控制器附加到body标签或html标签。然后,无论您在哪个页面,该控制器都将触发,您可以实现多页面套接字服务。

<html ng-app='YourApp' ng-controller="MasterCtrl">

<body ng-app='YourApp' ng-controller="MasterCtrl">

但是,最后我建议你做的是使用组件(可从Angular.js 1.5获得)。将您的scoket服务放在一个组件中。无论你需要使用套接字,都可以使用它。由于默认情况下组件带有隔离的作用域,因此您可以实现套接字服务,而不必担心范围冲突。

查看此网址以进一步了解组件。 https://toddmotto.com/exploring-the-angular-1-5-component-method/