想实现的方式如下
html
<pie-charts id="physicalPieChart" legend="legend" arr="arr"></pie-charts>
controller.js
$scope.arr = [];
$scope.test = function() {
.....
promise.then(function(data) {
for(var item in items) {
$scope.arr.push(item)
}
});
};
$scope.test();
console.log($scope.arr)
实现$scope.arr为全局变量,方便在diretive.js里面直接拿取。
directive.js
app.directive('pieCharts', function($http) {
return {
scope: {
id: "@",
legend: "=",
arr: "="
},
restrict: 'E',
template: '<div class="m-b-lg box-charts"></div>',
replace: true,
link: function($scope, element, attrs, controller) {
console.log($scope);
console.log('arr',$scope.arr); //undefined
$scope.arr = [...];
var option = {
title : {
text: '某站点用户访问来源',
left:'40%',
top:'5%',
textStyle:{
fontSize:'10',
fontWeight:'normal'
}
},
tooltip : {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
color:['#BEF1BE','#3CCFCF','#FBD5FB'],
legend: {
orient: 'vertical',
right: '5%',
top:'30%',
itemWidth:10,
itemHeight:10,
data: $scope.legend
},
// 数据内容数组
series: function(){
var serie = [];
var datas = [];
for(var i=0;i<$scope.legend.length;i++){
var items = {value:$scope.arr[i], name:$scope.legend[i]};
datas.push(items);
}
var item = {
name: '访问来源',
type: 'pie',
radius : '55%',
center: ['50%', '60%'],
data: datas,
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
};
serie.push(item);
return serie;
}()
};
var pieChart = echarts.init(document.getElementById($scope.id),'macarons');
pieChart.setOption(option);
window.onresize = pieChart.resize;
}
}
});
在指令里面打印的结果却是
不明白其实把数据push到arr里面其实在指令里面打印$scope是有arr数据的,但是专门打印$scope.arr却报undefind,是否是执行顺序的原因,还是?
Promise then中的代码是异步执行的,你无法保证then确定的执行时间,应该把依赖于then中数据的逻辑也放到then里面去写,不要写到全局空间