2012-11-27 46 views
5

Bazı verileri rastgele aralıklarla dışarı itmek için Düğüm sunucumu kurdum ve veriler istemciye/tarayıcıya ulaşıyor; Ancak, uygulamamın kontrol biriminde nasıl erişileceğini anlayamıyorum. Ben Terminaline alert oturum açtığınızdaNode.js + AngularJS + Socket.io: denetleyicide mevcut olmayan veriler

#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() 

, bu şuna benzer: aşağıdan

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

Ve arguments (alert olarak temelde aynı) İstediğim verileri içerir.

# /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 

Ancak, benim denetleyicisi arguments verilere erişmek için nasıl bilemiyorum: Ben denetleyicisi burada tarayıcının konsoluna data oturum açtığınızda

# /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']; 

, ben muazzam olsun $scope ana öğesi gibi görünüyor; ve data.alert tanımsızdır. arguments (callback.apply(…) hizmetlerinde 2 olduğundan), bu socketio.on('alert', function(data , args) gibi ikinci bir parametre belirtmeyi denedim, ancak konsolda oturum açtığımda, args undefined döndü.

Btw, bunu AngularJS stajyer tarafından a tutorial numaralı telefondan aldım. Farklı parçalar aynı isimlere sahipti, bu yüzden her farklı zeminin ne yaptığını anladığım için biraz sıkıntı çektim (aynı zamanda Yeşim'de de yararlı olmadı).

Gerçekten yapmak istediğim, görünümümde alert verileriyle bir bağlantı güncelleştirmesidir. senin on ve emit işlevlerinde

cevap

5

, kullandığınız:

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

ama öğretici bu özgün versiyonunda

, diyor:

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

var args = arguments önemlidir, args'u geri aramada iletilen argümanlara socket.on olarak ayarlar (aradığınız veri). Bu adım olmadan, aslında arguments'u kullandığınızda, $rootScope.$apply geri çağrısına iletilen argümanlara (bu, neden konsol çıkışını aldığınızı açıklayan bir Açısal kapsam according to the documentation) giderir.

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

aman tanrım şimdi mantıklıdır:

çözüm $apply çağrısına dışındaki argümanları yakalamak ve geri arama içine bu geçmek olacaktır. Neden sadece bir kez kullanmak için argümanlar tahsis etmekten rahatsız olduğunu merak ediyordum. Bunu sabahları deneyeceğim. Teşekkürler! – jacob

+2

Bu yazının yazarı burada: Bu doğru cevap. – btford

+0

Hazzaaah! İşe yaradı. Teşekkürler! – jacob

İlgili konular