AngularJS使用Echarts

Posted by banban on 2020-01-13

🤪

Echarts提供了非常强大的可视化功能,在平时的开发过程中难免用到echarts来助力数据展示。

那么在Angularjs中该如何使用echarts呢?下面撸一个例子方便后面参考。

指令&echarts

AngularJS中的指令是一种特有的处理DOM节点的方式,它可以操作以及渲染可重用的UI组件。例如想要用AngularJS处理echarts的一个柱状图📊,则可以通过下面的方式操作

angular.module('demo')
    .directive('myBarChart', function($window) { //定义柱状图指令
        return {
            restrict: 'EA', // 以属性或者tag的形式调用指令
            link: function($scope, element, attrs) {  //attrs 是DOM元素的属性集合
                var myBarChart = echarts.init(element[0]); // element是一个jqlite对象,如果JQuery再AngularJS之前引入,则是一个Jquery对象,可以使用Jquery所有的方法
                $scope.$watch(attrs.eData, function(newVal, oldVal, scope) {//监听属性e-data的值,当数据发生改变时执行作为第二个参数的函数
                    var xData = [],
                        sData = [],
                        data = newVal,
                        totalCount = 0;
                    angular.forEach(data, function(val) {
                        xData.push(val.name);
                        sData.push(val.value);
                        totalCount += val.value;
                    });
                    var option = {
                        title: {
                            text: '用户访问来源统计',
                            subtext: '总计值:' + totalCount,
                            x: 'center',
                        },
                        color: ['#333642'],
                        tooltip: {
                            trigger: 'axis',
                            axisPointer: {
                                type: 'shadow'
                            }
                        },
                        grid: {
                            left: '3%',
                            right: '4%',
                            bottom: '3%',
                            containLabel: true
                        },
                        xAxis: [{
                            type: 'category',
                            data: xData,
                            axisTick: {
                            alignWithLabel: true
                            }
                        }],
                        yAxis: [{
                            type: 'value'
                        }],
                        series: [{
                            name: '直接访问',
                            type: 'bar',
                            barWidth: '60%',
                            data: sData
                        }]
                    };
                    myBarChart.setOption(option);
                }, true);
                $window.onresize = function() {
                    myBarChart.resize();
                }
            }
        }
    });

通过指令处理好了组件之后,便可以在之后的开发中使用组件。

使用echarts指令

JavaScript

var app = angular.module("demo", []); //定义一个模块
angular.module("demo").controller("myCtrl", function($scope, $http, $interval) {
  //定义控制器
  $interval(function() {
    //调用$interval服务执行循环任务,3秒自动更新一次数据
    $http
      .get("/demo_get") //调用$http服务获取数据
      .success(function(data) {
        if (data.status == "0") {
          $scope.data = data.data; //将数据放在model中
        }
      })
      .error(function() {
        $scope.data[0].value = Math.floor(Math.random() * 2000); //模拟数据改变测试
      });
  }, 5000);
  //假设获取到的数据如下:
  var fakeData = {
    status: 0,
    data: [
      {
        value: 335,
        name: "直接访问"
      },
      {
        value: 310,
        name: "邮件营销"
      },
      {
        value: 234,
        name: "微信跳转"
      },
      {
        value: 135,
        name: "视频广告"
      },
      {
        value: 748,
        name: "搜索引擎"
      }
    ]
  };
  $scope.data = fakeData.data;
});

HTML

<div ng-app="demo" ng-controller="myCtrl" id="demo">
  <div style="height:320px;" my-bar-chart e-data="data"></div>
</div>

整体效果可以参考:https://codepen.io/zhilingsomnus/pen/mdyjqKX?editors=1010