为什么从AngularJS'内部加载时谷歌图不工作;s控制器.浏览器变白,控制台中没有任何错误
Why google graph not working when loading from inside AngularJS's controller. The browser goes white without any error in console
这样,当我像在页面加载时一样加载直方图时,它可以很好地工作。
$(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);
}
谷歌柱状图代码:(取自谷歌制图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);
}
};
我的问题:
但当我从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);
});
调试信息:
我可以在控制台中看到interval_start
和count
的值被打印出来,所以服务正在返回值fine
此外,我可以从loadChart((函数中看到histValues
预期地打印在控制台上。
这是一个相关的问题,以防你想要更深入的细节如何从json 创建直方图
只要我把loadChart2()
函数放在任何AngularJS onClick或任何函数中,我就会在控制台中获得完全的白色屏幕,没有任何错误。似乎没有人对我的问题发表任何评论,我会在这个页面上不断更新我的发现。
编辑我正在寻求这个问题的解决方案,我问了一个与这个问题有关的问题https://stackoverflow.com/questions/16816782/how-set-charts-data-in-google-chart-tool-directive-module-from-a-dynamically-po
关键是在谷歌图表库加载后手动引导Angular模块:
http://jsfiddle.net/nCFd6/22/
应用程序
var app = angular.module('app', []);
指令
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);
});
}
};
});
控制器
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;
};
});
Vodoo
google.setOnLoadCallback(function() {
angular.bootstrap(document, ['app']);
});
google.load('visualization', '1', {packages: ['corechart']});
查看
<div ng-controller="ChartController">
<button ng-click="loadDataFromServer()">load data</button>
<chart data="scoreHistory"></chart>
</div>
正如你在这个例子中看到的,我已经制定了一个图表指令,这样你就可以重用它
如果您已经定义了在文档根目录(<html>
标记(创建的模块,并且已经设置了一些控制器和指令,那么这里有一个替代方案可以提供一定的灵活性。
在application.js
中
var app = angular.module("chartApp", []);
app.controller("ChartCtrl", function($scope) {
$scope.buildTable = function() {
var dataTable = new google.visualization.DataTable();
dataTable.addColumn('string', 'Name');
dataTable.addColumn('string', 'Address');
var options = {showRowNumber: true};
var table = new google.visualization.Table(angular.element("div#chart")[0]);
var rows = [...]; //Table data here
dataTable.addRows(rows);
table.draw(dataTable, options);
}
//Other existing controllers and directives
在您的index.html
中
<div id="container" ng-controller="ChartCtrl">
<div id="chart">Loading...</div>
</div>
<script type="text/javascript" src="angular.js"></script>
<script type="text/javascript" src="application.js"></script>
<script type="text/javascript" src="google/charts/api"></script>
<script type="text/javascript">
google.setOnLoadCallback(function() {
angular.element("div#container" ).scope( ).buildTable();
});
google.load('visualization', '1', {packages:['table']});
</script>
有了这种方法,如果谷歌图表组件只是一个更大的应用程序的一个功能,那么它就消除了角度模块之间通信的复杂性。
我还在AngularJS的学习过程中。这个(https://stackoverflow.com/a/15012542/2406758)今天我大吃一惊,我想在接下来的几周里我会取得更大的进步。
它是AngularJS教程的绝佳伴侣,以我在其他任何地方都找不到的方式解释了服务、控制器和指令。还有一些很好的指令示例,有助于理解他所解释的内容。
我不完全确定这是否能解决你的问题,但这是一个很好的开始。
我想你最终会得到类似的东西
<div id='chart' chart-view>
.directive( 'chartView', function ( ) {
return {
scope: true,
link: function ( scope, element, attrs ) {
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);
}
};
});
您可以尝试以下URL:
AngularJs谷歌图表工具指令
http://bouil.github.io/angular-google-chart/
- 在指令控制器中使用$attrs时出现问题
- 访问布局信息是否也会导致浏览器重排
- ROR:如何在不重新加载浏览器的情况下从控制器获取参数
- angular应用程序中的浏览器功能检测:使用服务、指令、控制器
- 从浏览器调用角度控制器函数
- 如何在 Angular 控制器中使用浏览器化的 npm 包
- Angular ui路由器:按下浏览器中的后退按钮,停止控制器重新加载
- AngularJS检测浏览器返回按钮按下控制器
- 使用ajax将数组数据从浏览器中的javascript传递到springmvc控制器
- 如何将数据从SpringMVC控制器传递到浏览器javascript
- AngularJS:改变URL,但不改变浏览器后退和前进按钮的控制器或模板加载
- 如何下载图像(显示保存对话框在浏览器中),这是在html2canvas从控制器在MVC创建的字节的形式
- 为什么从AngularJS'内部加载时谷歌图不工作;s控制器.浏览器变白,控制台中没有任何错误
- 如何在用户关闭浏览器时在控制器中运行方法
- 如何将客户端值从浏览器端传递到node.js控制器
- 使用JSON在浏览器和控制器之间来回传递值
- Angularjs控制器在旧浏览器中的工作方式不同
- 使用ui-routing进行分页.返回(下一个)浏览器按钮没有重新加载控制器
- AngularJS:浏览器忽略我的控制器定义(依赖注入)
- 当我使用子路径时,快速加载控制器无限次,浏览器窗口崩溃