javascript - 使用angularJs显示来自socket io的数据

标签 javascript angularjs html asynchronous socket.io

我正在尝试从 socket io 获取数据并使用 angularJs 在图形上显示数据。我正在从服务器获取正确的数据,但是当我试图显示它时,我得到:“没有数据要显示”。我试图调试我的 Controller ,我看到我正在获取数据,但我的 HTML 上的某些 Angular 没有显示它。 我也尝试使用 Async.js,但它仍然不起作用。

我的 Controller 代码:

$scope.graph2,data2 = [];
            socketFactory.emit('getTemplateStatistics', null);
            socketFactory.on('sendTemplateStatistics', function(result) {
                for (var i=0; i < result.length; i++) {
                    var temp = {label: result[i]._id, value: ""+result[i].total};
                    data2.push(temp);
                }
                    $scope.graph2 = {
                    chart: {
                        caption: "Age profile of website visitors",
                        subcaption: "Last Year",
                        startingangle: "120",
                        showlabels: "0",
                        showlegend: "1",
                        enablemultislicing: "0",
                        slicingdistance: "15",
                        showpercentvalues: "1",
                        showpercentintooltip: "0",
                        plottooltext: "Age group : $label Total visit : $datavalue",
                        theme: "fint"
                    },
                data2
                };
});

我的 HTML 代码:

<div class="statistics view indent">
    <div class="container" style="margin-top:10px">
        <header>
            <h3>Statistics Preview Displayer</h3>
        </header>
        <div>
            <fusioncharts 
                width="600" 
                height="400"
                type="pie3d"
                datasource="{{ graph2 }}"
            ></fusioncharts>
        </div>
        <a href="#/preferences" class="btn btn-primary" style="float: right;">Go back</a>
    </div>
</div>

最佳答案

我不认为这是套接字问题。可能 '$scope.graph2' 在 for 循环完成执行之前被分配,因此 'data2' 没有值(value)。尝试像这样更改代码

$scope.graph2,data2 = [];
socketFactory.emit('getTemplateStatistics', null);
socketFactory.on('sendTemplateStatistics', function(result) {
    for (var i=0; i < result.length; i++) {
        var temp = {label: result[i]._id, value: ""+result[i].total};
        data2.push(temp);
        if(i == result.length - 1) {               // To ensure $scope.graph2 is assigned only after for loop completes and data has all values
            $scope.graph2 = {
                chart: {
                    caption: "Age profile of website visitors",
                    subcaption: "Last Year",
                    startingangle: "120",
                    showlabels: "0",
                    showlegend: "1",
                    enablemultislicing: "0",
                    slicingdistance: "15",
                    showpercentvalues: "1",
                    showpercentintooltip: "0",
                    plottooltext: "Age group : $label Total visit : $datavalue",
                    theme: "fint"
                },
                data2
            };
        }
    }
});

这样 $scope.graph2 只有在 for 循环完成后才被赋值,所以 data2 不会为 null

关于javascript - 使用angularJs显示来自socket io的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429050/

相关文章:

javascript - 根据复选框状态在搜索按钮上发出值,AngularJS

javascript - 如何根据单选按钮选择更改文本输入的最大长度验证?

java - 从 html 调用小程序

javascript - Internet Explorer 的 pushState 回退?

javascript - 如何使用 Google Feed API 从 RSS Feed 加载图像?

javascript - 禁用 Angular-strap 2.0 中的单个日期

javascript - 元素的高度是视口(viewport)的左边

javascript - 如何在 Nuxt 中从一个 Vuex 状态访问另一个状态?

javascript - 在循环中通过 JavaScript 调用 Web 服务

angularjs + bootstrap ui + $modal -> 只在第一次显示