2015-09-30 48 views
1

我正在尋找將socket.io與我的角應用程序集成在一起。我見過一些如何創建服務的例子,這使得它可以在控制器上訪問。我明白。但我正在尋找一種方式,所有的控制器都可以對來自socket.io的事件調用做出反應。在Angular應用程序中偵聽socket.io

所以:

socket.on('user joined', function (data) {});

我能做到這一點的一個控制器,但我怎麼做它呢?

+0

你應該在服務中做到這一點,並將其注入控制器。 –

回答

1

你會想要encapsulate your socket in a service and inject it into Angular controllers as needed

讓我們創建一個Socket服務:

app.factory('socket', function ($rootScope) { 
    var socket = io.connect(); 
    return { 
    on: function (eventName, callback) { 
     socket.on(eventName, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      callback.apply(socket, args); 
     }); 
     }); 
    }, 
    emit: function (eventName, data, callback) { 
     socket.emit(eventName, data, function() { 
     var args = arguments; 
     $rootScope.$apply(function() { 
      if (callback) { 
      callback.apply(socket, args); 
      } 
     }); 
     }) 
    } 
    }; 
}); 

然後,我們將注入控制器和與它進行交互(通過socket.io API):

function AppCtrl($scope, socket) { 
    socket.on('init', function (data) { 
    $scope.name = data.name; 
    $scope.users = data.users; 
    }); 
} 

可以很明顯的自定義控制器用套接字服務來做你所需要的。

+0

是的,我意識到在所有控制器中都沒有意義......顯然!我現在的問題是如何初始化連接「var socket = io.connect();」每次我實例化它時它會啓動一個新的連接嗎? –

+1

明白了!但現在我遇到了麻煩,「未捕獲的ReferenceError:io未定義」 –

+0

您的客戶端頁面上引用了'socket.io' js嗎?您可能也必須[啓動服務器上的偵聽器](http://stackoverflow.com/a/13372692/4118286)。 – zacran

相關問題