Skonfigurowałem serwer Node, aby wypychał niektóre dane w losowych odstępach czasu, a dane docierały do klienta/przeglądarki; nie mogę jednak dowiedzieć się, jak uzyskać do niego dostęp w kontrolerze mojej aplikacji.Node.js + AngularJS + Socket.io: dane pchane niedostępne w kontrolerze
#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()
Kiedy loguję alert
do terminalu, to wygląda to tak:
alert: {
id: 258,
lat: -95.20933,
long: 37.027676,
neighbourhood: "Downtown",
time: //stringified js timestamp
}
I arguments
z poniżej zawiera dane chcę (w zasadzie taki sam jak 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
Jednak nie mogę dowiedzieć się, jak uzyskać dostęp do danych z arguments
w moim kontrolera:
# /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'];
Kiedy loguję data
do konsoli przeglądarki tutaj w sterowniku, mam ogromny obiekt, który wydaje się być rodzicem $scope
; i data.alert
jest niezdefiniowany. Próbowałem również określić drugi parametr, taki jak ten socketio.on('alert', function(data , args)
, myśląc, że może to być arguments
(od callback.apply(…)
w usługach ma 2), ale kiedy zrobiłem i zalogowałem go do konsoli, args
wrócił niezdefiniowany.
Przy okazji opieram to na a tutorial przez stażystę AngularJS. Różne kawałki miały te same nazwy, więc miałem trochę problemów z ustaleniem, co każdy z nich zrobił (także nie było pomocne, że był w Jade).
Co naprawdę chcę zrobić, to zaktualizować powiązanie w moim widoku z danymi z alert
.
O mój Boże teraz to ma sens. Zastanawiałem się, dlaczego niepokoi się przypisywaniem argumentów, aby użyć go tylko raz. Spróbuję tego rano. dzięki! – jacob
Autor tego artykułu tutaj: to jest właściwa odpowiedź. – btford
Hazzaaah! Zadziałało. Dzięki! – jacob