嘿伙计们我遇到了一个奇怪的问题。我的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: '/'
});
});
任何想法有什么不对?
答案 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/