Node.js + AngularJS + Socket.io:推送的数据在控制器中不可用

我已经设置了我的节点服务器以随机间隔推出一些数据,并且数据正在到达客户端/浏览器; 然而,我不知道如何在我的应用程序的控制器访问它。

#node.js file: /server.js (truncated for brevity) var http = require('http').createServer(handler),//refers to handler() fs = require('fs'), io = require('socket.io').listen(http); http.listen(8000); … io.sockets.on('connection', function (socket) { /* DUMMY CODE: this generates fake alerts at random intervals */ (function loop() { var rand = Math…; … setTimeout(function(){ … var alert = { … }; socket.emit('alert', { "alert": alert });//socket.emit() loop(); }, rand); }()); });//io.sockets.on() 

当我alertterminal的alert ,它看起来像这样:

 alert: { id: 258, lat: -95.20933, long: 37.027676, neighbourhood: "Downtown", time: //stringified js timestamp } 

从下面的arguments包含我想要的数据(基本相同的alert )。

 # /app/js/services.js angular.module( 'BAR.services' , []) .factory('socketio', function($rootScope){ var socket = io.connect(); return { on: function(event, callback) { socket.on(event, function(){ //console.log(arguments); $rootScope.$apply(function(){ callback.apply(socket, arguments); });//$rootScope.$apply() });//socket.on() },//on emit: function(event, data, callback) { socket.emit(event, data, function(){ //console.log(arguments); $rootScope.$apply(function(){ if (callback) callback.apply(socket, arguments); });//$rootScope.$apply() });//socket.emit() },//emit disconnect: function() { socket.disconnect(); } }//return });// AlertServices 

但是,我不知道如何访问我的控制器中的arguments的数据:

 # /app/js/controllers.js function Alerts( $scope , socketio ) { socketio.on('alert', function(data) { console.log(data); /* I expect this to be the data I want */ $scope.alert = data.alert; }); $scope.disconnect = function(){ socketio.disconnect(); } } Alerts.$inject = ['$scope','socketio']; 

当我将datalogging到控制器的浏览器控制台时,我得到一个巨大的对象,它似乎是$scope的父对象; data.alert是未定义的。 我也试图指定第二个参数,如socketio.on('alert', function( data , args )认为它可能是arguments (因为服务中的callback.apply( … )有2),但是当我做了并logging它到控制台, args返回undefined。

顺便说一句,我基于AngularJS实习生的教程 。 不同的作品具有相同的名字,所以我在确定每个不同的作品时都遇到了一些困难(对Jade也没有帮助)。

我真正想要做的是使用alert的数据更新我的视图中的绑定。

在你onemitfunction,你正在使用:

 socket.on(event, function() { $rootScope.$apply(function() { callback.apply(socket, arguments); }); }); 

但是在本教程的原始版本中,它说:

 socket.on(eventName, function() { var args = arguments; $rootScope.$apply(function () { callback.apply(socket, args); }); }); 

var args = arguments很重要,因为它将args设置为传递给socket.on (这是您正在查找的数据)的callback参数。 如果没有这个步骤,当你实际使用arguments ,它会parsing传入到$rootScope.$apply的callback参数$rootScope.$apply (这是根据文档的一个angular度范围,解释了为什么你得到控制台输出)。

解决的办法是将调用之外的参数捕获到$apply ,并将这些parameter passing给你的callback:

 socket.on(event, function() { var args = arguments; $rootScope.$apply(function() { callback.apply(socket, args); }); });