2017-08-06 64 views
0

嘿,我遇到了一個奇怪的問題。我的socket.emit正在爲我的一個控制器工作,但它不適用於另一個控制器。socket.emit只適用於一個控制器AngularJS

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.on('connect', function(){ ... }socket.emit,但沒有奏效。

這是我的路線:

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

您知道根據您當前的路線只有一個控制器處於活動狀態嗎? – Quad

+0

我不知道。我必須做什麼才能切換到新的主動控制器?可能嗎? – Student22

+1

當您訪問http:// yourapp/queue時,將獲得您在路由配置中定義的模板和控制器。如果你去/聊天(你可以輸入網址欄或在頁面的某個地方放一個鏈接),你可以通過它的模板獲得chatcontroller。如果你想要一個路由器中的附加控制器,你需要將一個帶有ng-controller的元素放在你的模板中。 – Quad

回答

0

在你的情況下,它主要是一個範圍問題。在您的路由配置中,每個控制器都被定義爲擁有頂級作用域的控制器。而當您更改頁面時,該頂級示波器控制器會一起切換。

一種解決方法是構建一個將用於所有頁面的控制器,例如MasterCtrl或RootCtrl。然後,您可以將該控制器附加到body標籤或html標籤。然後,無論您處於哪個頁面,該控制器都會觸發,您可以實現多頁面套接字服務。

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

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

然而,什麼最終我建議你做的是使用組件(可從Angular.js 1.5)。把你的scoket服務放在一個組件中。無論您需要使用套接字,都可以使用它。由於默認情況下組件帶有獨立的作用域,因此可以實現套接字服務而不必擔心範圍衝突。

查看此URL以進一步瞭解組件。 https://toddmotto.com/exploring-the-angular-1-5-component-method/

相關問題