65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 AngularJS 和 angular-google-chart 创建图表的自定义指令

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2017年5月25日

CPOL

3分钟阅读

viewsIcon

15464

本文将帮助你在 AngularJS 中绘制图表。

引言

AngularJS 最重要的特性是 **指令**,因为它具有扩展 HTML 标签和属性以及可重用性的功能。 如果你了解如何创建 **自定义指令** 并使用它,就可以灵活地操作 AngularJS 代码。

**Angular Google chart** 是 Google 提供的一个非常有用的扩展,用于绘制各种类型的图表。

本文将解释创建自定义指令的简单步骤,这些指令可以根据用户提供的图表类型绘制不同的图表。

文章的其余部分将按照需求、方法、结果、结论和参考文献的顺序进行组织。

要求

要使用 **Angular Google chart** 绘制图形,必须将相应的 JavaScript 文件包含在项目中。 所需的文件名为 ng-google-chart.js,可以从 这里 下载。

别忘了在你的 HTML 页面中设置 ng-google-chart.js 的引用。

方法论

1. 创建自定义指令并使用 google-chart

首先,我们需要创建一个可重用且易于维护的自定义指令,该指令根据从控制器传递的数据绘制图表。 让我们看一下自定义指令及其解释。

app.directive('appColumnchart',
    function () {
        return {
            scope: {                      //set up directive's isolated scope
                filterBy: '=ngModel',       
                data: '=data',           
                title: '=title',
                stacked: '=stacked',
                type: '@'
            },
            restrict: 'EA',
            transclude: false,
            template:
                '<div google-chart  
                chart="colChartObject"></div>',  //including google-chart directive
            link: function ($scope) {

                $scope.colChartObject = {};
                $scope.colChartObject.type = $scope.type; //setting chart type
                $scope.colChartObject.displayed = true;

                $scope.Colors = [
                    ['#CB7472', '#A895BF', '#F8A769', '#A7514F', '#C0504D', '#9BBB59'],
                    ['#7399C9', '#A8C472', '#8AC8D9', '#426690', '#4BACC6', '#8064A2'],
                    ['#4F81BD', '#C0504D', '#9BBB59', '#A895BF', '#F8A769', '#A7514F'],
                    ['#F79646', '#4BACC6', '#8064A2', '#A8C472', '#8AC8D9', '#426690']
                ];
                
                $scope.colChartObject.data = $scope.data; //setting chart data

                //setting chart options
                $scope.colChartObject.options = {
                    title: $scope.title,              //chart title
                    isStacked: $scope.stacked,        //chart is stacked or not
                    titleTextStyle: { color: '#000000', 
                    fontName: 'Open Sans', fontSize: 16, 
                                 bold: true, italic: false },  //title style
                    height: 250,  
                    colors: $scope.Colors[Math.floor(Math.random() * $scope.Colors.length)]  //colors
                };
            }
        }
    });

这里,创建了一个名为 appColumnchart 的自定义指令。 它接收通过隔离作用域从控制器传递的不同变量。

该指令使用 google-chart 指令作为模板来绘制图表,即:

<div google-chart  chart="colChartObject"></div>

在这里,我们需要设置 chart 属性。 Chart 属性具有不同的属性,例如 typedataoptions 等。 再次,options 属性具有几个子属性,这些属性在上面的代码中已提及和解释。

2. 创建所需的控制器

然后,我们需要在 AngularJS 中创建控制器,通过该控制器可以将数据传递给指令。

这里是演示控制器的示例,其中数据被初始化和硬编码,但在实际应用中,数据可能需要从数据库中获取。 为了简单起见,这里的值是硬编码的。

app.controller('ChartController',
[
    function () { 
$scope.chartData= {
        cols: [                //defines number of levels with input type
            {
                id: "month",
                label: "Month",
                type: "string"
            },
            {
                id: "Tables-id",
                label: "Tables",
                type: "number"
            },
            {
                id: "Chairs-id",
                label: "Chairs",
                type: "number"
            },
            {
                id: "Bed-id",
                label: "Bed",
                type: "number"
            },
            {
                id: "Desk-id",
                label: "Desk",
                type: "number"
            }
        ],
        rows: [             // defines input with respect to cols value
            {
                c: [
                    {
                        v: "January"
                    },
                    {
                        v: 19,          //value required to plot chart
                        f: "19 Tables"  //description which is shown on mouse hover
                    },
                    {
                        v: 12,
                        f: "12 Chairs"
                    },
                    {
                        v: 7,
                        f: "7 Beds"
                    },
                    {
                        v: 4,
                        f: "4 Desks"
                    }
                ]
            },
            {
                c: [
                    {
                        v: "February"
                    },
                    {
                        v: 13
                    },
                    {
                        v: 1,
                        f: "only 1unit"
                    },
                    {
                        v: 12
                    },
                    {
                        v: 2
                    }
                ]
            },
            {
                c: [
                    {
                        v: "March"
                    },
                    {
                        v: 24
                    },
                    {
                        v: 5
                    },
                    {
                        v: 11
                    },
                    {
                        v: 6
                    }
                ]
            }
        ]
    },
}
]);

上面的代码中的 chartData 被传递给自定义指令,然后自定义指令将数据传递给 google-chart 指令,从而绘制图表。

3. 在 HTML 中使用

创建的自定义指令可以在 HTML 中如下使用:

除了图表数据之外,我们还需要传递标题(将在图表顶部显示)、堆叠(根据 true/false 值,输出将是堆叠或非堆叠)、type(根据类型绘制图表)。

结果

示例 1:柱状图(堆叠)

<div ng-controller="ChartController">
  <app-columnchart
   data="chartData" title="'Sales per month(Stacked)'"
   stacked="true" type="ColumnChart" />
</div>

对于柱状图,类型应为 "ColumnChart"。 这里,传递了 stacked="true" 以获得堆叠输出。

以上数据和输入 HTML 的输出如下:

示例 2:柱状图(非堆叠)

<div ng-controller="ChartController">
  <app-columnchart
   data="chartData" title="'Sales per month(non-Stacked)'"
   stacked="false" type="ColumnChart" />
</div>

这里传递了 stacked="false"

以上数据和 input HTML 的输出如下:

示例 3:条形图

<div ng-controller="ChartController">
  <app-columnchart
   data="chartData" title="'Sales per month'"
   stacked="false" type="BarChart" />
</div>

对于条形图,类型应为 "BarChart"。

以上数据和 input HTML 的输出如下:

结论

在本文中,介绍了一种更简单的方法来创建自定义指令,该指令可以根据用户输入和需求绘制不同类型的图表。 希望你喜欢阅读这篇文章,并且它对你有所帮助。

参考文献

  1. AngularJs 中的指令
  2. Angular Google 图表
© . All rights reserved.