Javascript Node.js+;AngularJS+;Socket.io:控制器中不可用的推送数据
我已经将我的节点服务器设置为以随机间隔推出一些数据,并且这些数据正在进入客户端/浏览器;但是,我不知道如何在我的应用程序的控制器中访问它Javascript Node.js+;AngularJS+;Socket.io:控制器中不可用的推送数据,javascript,node.js,websocket,socket.io,angularjs,Javascript,Node.js,Websocket,Socket.io,Angularjs,我已经将我的节点服务器设置为以随机间隔推出一些数据,并且这些数据正在进入客户端/浏览器;但是,我不知道如何在我的应用程序的控制器中访问它 #node.js file: /server.js (truncated for brevity) var http = require('http').createServer(handler),//refers to handler() fs = require('fs'), io = require('sock
#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: {
id: 258,
lat: -95.20933,
long: 37.027676,
neighbourhood: "Downtown",
time: //stringified js timestamp
}
下面的参数
包含了我想要的数据(基本上与警报
相同)
但是,我不知道如何从控制器中的参数
访问数据:
# /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'];
当我将数据
记录到控制器中的浏览器控制台时,我得到一个巨大的对象,它似乎是$scope
的父对象;和数据。警报未定义。我还尝试指定第二个参数,如socketio。在('alert',function(data,args)
上,我认为它可能是参数
(因为callback.apply(…)
在服务中有2个参数),但当我这样做并将其记录到控制台时,args
返回未定义的参数
顺便说一句,我是根据AngularJS的一位实习生的说法来做这件事的。不同的作品有着相同的名字,所以我很难弄清楚每一件不同的作品都做了些什么(而且它在翡翠中也没什么用)
我真正想做的是使用上的和发出的函数中的警报中的数据更新视图中的绑定,您正在使用:
# /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
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的回调的参数(这是您正在查找的数据)。如果不执行此步骤,当您实际使用arguments
时,它将解析为传递到$rootScope.$apply
(这是一个角度范围,解释了为什么会得到控制台输出)
解决方案是捕获调用$apply
之外的参数,并将其传递到回调中:
socket.on(event, function() {
var args = arguments;
$rootScope.$apply(function() {
callback.apply(socket, args);
});
});
哦,天哪,这是有道理的。我想知道他为什么费心指定参数只使用一次。我明天早上会试试。谢谢!顺便说一句,@btford,谢谢你的教程!(但请不要用同一个名称命名不同的事物)