ランダムな間隔でいくつかのデータをプッシュし、データがクライアント/ブラウザに到達するようにノードサーバーをセットアップしました。しかし、私はどのように私のアプリのコントローラでそれにアクセスするかを把握することはできません。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
をログインすると、それは次のようになります。以下から
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
をログインすると、私は巨大なを取得します$scope
の親と思われるオブジェクト。 data.alert
は未定義です。私もarguments
(サービスではcallback.apply(…)
は2であるので)socketio.on('alert', function(data , args)
と思っていましたが、コンソールに記録したときにargs
が返されました。
Btw、これはAngularJS internによってa tutorialに基づいています。異なった部分には同じ名前がついていたので、それぞれの部分が何をしたのかを調べるのに少し苦労しました。
私が実際にやりたいことは、ビュー内のバインディングをalert
のデータで更新することです。あなたのon
とemit
機能で
おやっ私のああ、今それが理にかなっています。私はなぜそれを一度だけ使うように議論をつけるのに悩まされたのだろうと思っていました。私は朝にそれを試みます。ありがとう! – jacob
こちらの記事の著者:これは正しい答えです。 – btford
ハズザ!出来た。ありがとう! – jacob