2012-11-27 6 views
5

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.

Odpowiedz

5

W swoim on i emit funkcji używasz:

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

ale w pierwotnej wersji tego od samouczka, to mówi:

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

var args = arguments to ważne, ponieważ ustawia args na argumenty przekazywane do wywołania zwrotnego na socket.on (które są danymi, których szukasz). Bez tego kroku, kiedy faktycznie użyjesz arguments, rozwiąże on argumenty przekazane do wywołania zwrotnego do $rootScope.$apply (który jest zakresem kątowym according to the documentation, wyjaśniając, dlaczego otrzymujesz wyjście konsoli, które robisz).

Rozwiązaniem byłoby uchwycić argumenty poza wywołaniem $apply i przekazać te do swojej zwrotnego:

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

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

+2

Autor tego artykułu tutaj: to jest właściwa odpowiedź. – btford

+0

Hazzaaah! Zadziałało. Dzięki! – jacob

Powiązane problemy