从AngularJS的控制器内部加载时,为什么谷歌图形无法正常工作.浏览器变为白色,控制台没有任何错误

Wat*_*att 5 javascript graph angularjs

这样我的直方图工作正常,当我在页面加载期间加载它.

$(document).ready()
{
x = new Array(10);
for (var i = 0; i < 10; i++) {
    x[i] = new Array(2);
    x[i][0]="txt";
    x[i][1]=100;

}
loadChart2(x);
}
Run Code Online (Sandbox Code Playgroud)

谷歌柱形图代码:(采用谷歌图表api)

function loadChart2 (histValues)
{
    console.log('histValues:'+histValues);
    google.load("visualization", "1", {packages:["corechart"]});
    google.setOnLoadCallback(drawChart);
    function drawChart() {
        var data = google.visualization.arrayToDataTable(histValues);

        var options = {
            hAxis: {title: 'Score', titleTextStyle: {color: 'red'}}
        };

        var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
        chart.draw(data, options);
    }
};
Run Code Online (Sandbox Code Playgroud)

我的问题:

但是当我从angularJS控制器内部调用loadChart2()时,整个屏幕变为白色,并且浏览器控制台中没有显示错误.

$http({method: 'GET', url: urlGetHistogramData, timeout: maxTime})
            .success(function (data) {
            x=new Array(data.score_hist.length);
            var i=0;
            $.each(data.score_hist, function(){
                x[i] = new Array(2);
                x[i][0]=this.interval_start;
                x[i][1]=this.count;
                i++;
                });


                loadChart2(x);
Run Code Online (Sandbox Code Playgroud)

});

调试信息:

我可以在控制台中看到打印的值interval_startcount值,因此服务返回值很好

此外,我可以看到histValues期望从loadChart()函数打印在控制台上.

这是一个相关的问题,以防您需要更深入的详细信息 如何从json创建历史图

只要我将loadChart2()函数放在任何AngularJS onClick或任何函数中,我就会在控制台中获得完全白屏并且没有错误.看来,没有人对我的问题发表任何评论,我将根据我的调查结果更新此页面.

编辑 我正在寻求解决此问题的方法,我问了一个与此问题相关的问题 /sf/ask/1177174771/从-A-动态-PO

com*_*oma 9

关键是在Google图表库加载后手动引导您的Angular模块:

http://jsfiddle.net/nCFd6/22/

应用

var app = angular.module('app', []);
Run Code Online (Sandbox Code Playgroud)

指示

app.directive('chart', function() {

    return {
        restrict: 'E',
        replace: true,
        scope: {
            data: '=data'
        },
        template: '<div class="chart"></div>',
        link: function(scope, element, attrs) {

            var chart = new google.visualization.LineChart(element[0]);
            var options = {};

            scope.$watch('data', function(v) {

                var data = google.visualization.arrayToDataTable(v);
                chart.draw(data, options);

            });

        }
    };

});
Run Code Online (Sandbox Code Playgroud)

调节器

app.controller('ChartController', function($scope) {

    $scope.scoreHistory = [];
    $scope.loadDataFromServer = function() {

        var x = [
            ['interval', 'count']
        ];

        var scoreHistory = [
            {
                intervalStart: 12,
                count: 20
            },
            {
                intervalStart: 100,
                count: 200
            },
            {
                intervalStart: 200,
                count: 50
            },
            {
                intervalStart: 250,
                count: 150
            }
        ];

        angular.forEach(scoreHistory, function(record, key) {

            x.push([
                record.intervalStart,
                record.count
            ]);

        });

        $scope.scoreHistory = x;

    };

});
Run Code Online (Sandbox Code Playgroud)

Vodoo

google.setOnLoadCallback(function() {

    angular.bootstrap(document, ['app']);

});

google.load('visualization', '1', {packages: ['corechart']});
Run Code Online (Sandbox Code Playgroud)

视图

<div ng-controller="ChartController">
    <button ng-click="loadDataFromServer()">load data</button>
    <chart data="scoreHistory"></chart>
</div>
Run Code Online (Sandbox Code Playgroud)

正如您在本示例中所看到的,我已经制作了一个图表指令,因此您可以重复使用它.