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()
当我alert
terminal的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'];
当我将data
logging到控制器的浏览器控制台时,我得到一个巨大的对象,它似乎是$scope
的父对象; data.alert
是未定义的。 我也试图指定第二个参数,如socketio.on('alert', function( data , args )
认为它可能是arguments
(因为服务中的callback.apply( … )
有2),但是当我做了并logging它到控制台, args
返回undefined。
顺便说一句,我基于AngularJS实习生的教程 。 不同的作品具有相同的名字,所以我在确定每个不同的作品时都遇到了一些困难(对Jade也没有帮助)。
我真正想要做的是使用alert
的数据更新我的视图中的绑定。
在你on
和emit
function,你正在使用:
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); }); });