5

ランダムな間隔でいくつかのデータをプッシュするようにノードサーバーをセットアップしました。データはクライアント/ブラウザーに到達しています。ただし、アプリのコントローラーでアクセスする方法がわかりません。

#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未定義です。また、このように2番目のパラメーターを指定しようとしましたsocketio.on('alert', function( data , args )arguments(callback.apply( … )サービスには2があるため)、実行してコンソールに記録すると、args未定義が返されました。

ところで、これは AngularJS のインターンによるチュートリアルに基づいています。さまざまなピースが同じ名前を持っていたので、それぞれのピースが何をするのかを理解するのに少し苦労しました(ジェイドにあったことも役に立ちませんでした)。

私が本当にやりたいことは、ビュー内のバインディングを からのデータで更新することですalert

4

1 に答える 1

5

onおよびemit関数では、次を使用しています。

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に設定されるため、重要です。このステップがないと、実際にを使用すると、コールバックに渡された引数に解決されます(これは、ドキュメントによるとAngularスコープであり、コンソール出力を取得する理由を説明しています)。argssocket.onarguments$rootScope.$apply

解決策は、呼び出しの外部で引数をキャプチャし、$applyそれらをコールバックに渡すことです。

socket.on(event, function() {
  var args = arguments;
  $rootScope.$apply(function() {
    callback.apply(socket, args);
  });
});
于 2012-11-27T03:15:42.163 に答える