【问题标题】:receive data from flash and display on angularJS client side从 Flash 接收数据并在 angularJS 客户端显示
【发布时间】:2014-07-13 20:07:58
【问题描述】:

我正在尝试从我制作的一个非常简单的 Flash 游戏中获取数据(用户的分数),以显示在通过 AngularJS 显示的简单排行榜上。您可以获得所有代码 here 的副本(您可能需要运行 npm install 才能使其工作)。我正在使用 NodeJS/Express/Socket.io 从游戏中传输数据。

这是来自 app.js(服务器端)的代码:

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server);

app.configure(function() {
    app.use(express.static(__dirname + '/public'));
    app.set('views', __dirname + '/views');
});

io.configure(function() {
  io.set('transports', ['websocket','xhr-polling']);
  io.set('flash policy port', 10843);
});

var contestants = [];

io.sockets.on('connection', function(socket) {

    socket.on('data', function (data) {
        socket.broadcast.emit(data);
    });

    socket.on('listContestants', function(data) {
    socket.emit('onContestantsListed', contestants);
    });

    socket.on('createContestant', function(data) {
    contestants.push(data);
    socket.broadcast.emit('onContestantCreated', data);
    });

    socket.on('updateContestant', function(data){
    contestants.forEach(function(person){
      if (person.id === data.id) {
        person.display_name = data.display_name;
        person.score = data.score;
      }
    });
    socket.broadcast.emit('onContestantUpdated', data);
    });

    socket.on('deleteContestant', function(data){
    contestants = contestants.filter(function(person) {
      return person.id !== data.id;
    });
    socket.broadcast.emit('onContestantDeleted', data);
    });
});

server.listen(8000);

上面的重点是:

socket.on('data', function (data) {
    socket.broadcast.emit(data);
});

这就是我试图将数据从服务器端发送到客户端的地方。在客户端 - 在我的主控制器中,我有这个。

leader-board.js(主客户端 javascript 文件):

socket.on('data', function(data) {
    $scope.score.push(data);
})

    // Outgoing
$scope.createContestant = function() {

    $scope.$digest;

    console.log($scope.score[0]);

    var contestant = {
        id: new Date().getTime(),
        display_name: "Bob",
        score: Number($scope.score[0])
    };

    $scope.contestants.push(contestant);
    socket.emit('createContestant', contestant);

    _resetFormValidation();
};

如您所见 - 我正在尝试获取发出的数据,并将其推送到我将保留分数的数组。当用户单击主 index.html 文件中的提交按钮时,将调用 createContestant 函数。

index.html

<body>

...

<button ng-click="createContestant()" class="btn btn-success" 
        ng-disabled="
            ldrbd.contestantName.$error.required || 
            ldrbd.contestantScore.$error.required
        "
>
    Submit Score
</button>

...

</body>

console.log($scope.score[0]); 函数中的行 createContestant 始终是 undefined。我不确定我是否使用socket.io 从服务器端正确发送数据 - 我也不确定我是否正确接收它。我使用$scope.$digest 来刷新范围,因为socket.io 的东西在AngularJS 之外(或者我已经阅读过)。任何帮助将不胜感激。再次 - 我正在尝试将 Flash 游戏发出的数据存储到一个数组中,但是 - 在存储数据之前,需要正确获取它 - 我的获取总是出现 undefined,当它应该检索一个数字时正在从游戏中发出(我知道我正在从游戏中发出数字,因为我已经用日志消息对其进行了测试)。谢谢!

更新

将服务器端代码更改为:

socket.on('message', function (data) {
    console.log(data)
    score = data;
    socket.emit('score', score);
})

...和客户端:

socket.on('score', function(data) {
    console.log(data);
    $scope.score = data;
});

仍然没有运气 - 但我将 console.log 消息添加到服务器端以确认数据正在发送和接收(至少通过节点)并且它是 - 该消息的输出是一个数字,它是分数。我意识到的是......当点击按钮时,分数应该在客户端输入。但是当游戏结束时,数据会从服务器端发出……所以当单击按钮时……那一刻数据是否可供客户端使用?这是差异吗?

【问题讨论】:

    标签: javascript node.js angularjs flash sockets


    【解决方案1】:

    这是有效的套接字代码(花了我一段时间,但我明白了)!

    服务器端(Node/Express):

    socket.on('message', function (data) {
        console.log(data);
        score = data;
        console.log("Transfered:" + " " + score);
        //
    })
    
    socket.on('score', function() {
        socket.emit('sendscore', score);
    })
    

    客户端(AngularJS)

    socket.on('sendscore', function(data) {
        console.log(data);
        $scope.score = data;
    });
    
    // Outgoing
    $scope.createContestant = function() {
    
        socket.emit('score')
    
        //$scope.$digest;
    
        //console.log($scope.score[0]);
    
        var contestant = {
        id: new Date().getTime(),
        display_name: "Bob",
        score: $scope.score
        };
    
        $scope.contestants.push(contestant);
        socket.emit('createContestant', contestant);
    
        _resetFormValidation();
    };
    

    如果您想自己尝试,问题中的链接仍然适用于代码!

    【讨论】:

      猜你喜欢
      • 2012-07-31
      • 2021-09-30
      • 2012-11-20
      • 1970-01-01
      • 2012-01-31
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多