0

我有用 Angular JS 制作的图表。我有两个指令,第一个名为 Linear Chart 1 的指令用于单个图形,第二个名为 Linear Chart 的指令是第一个图形中每个图形的编译。我的问题是我无法访问从线性图表 1 到线性图表的控制器和范围。我将如何访问控制器和范围?

我的控制器代码:

 app.controller('GraphLineController', ['$scope', '$interval', function ($scope, $interval) {
            $scope.graphLine = [{
                "label1": 'PC-1',
                "name": 'PC-1',
                "cpu": [
                        { i: 0, util: 100 },
                        { i: 1, util: 20 },
                        { i: 2, util: 100 },
                        { i: 3, util: 30 },
                        { i: 4, util: 40 },
                        { i: 5, util: 60 },
                        { i: 6, util: 80 },
                        { i: 7, util: 90 },
                        { i: 8, util: 100 },
                        { i: 9, util: 10 }],
                "mem": [90, 90, 90, 90, 90, 90, 90, 90, 90, 90],
                "color": "#FF4C4B"
            }, {
                "label2": 'PC-2',
                "name": 'PC-2',
                "cpu": [
                        { i: 0, util: 50 },
                        { i: 1, util: 90 },
                        { i: 2, util: 10 },
                        { i: 3, util: 40 },
                        { i: 4, util: 100 },
                        { i: 5, util: 20 },
                        { i: 6, util: 70 },
                        { i: 7, util: 90 },
                        { i: 8, util: 60 },
                        { i: 9, util: 30 }],
                "mem": [80, 80, 80, 80, 80, 80, 80, 80, 80, 80],
                "color": "#586FFF"
            }, {
                "label3": 'PC-3',
                "name": 'PC-3',
                "cpu": [
                        { i: 0, util: 40 },
                        { i: 1, util: 10 },
                        { i: 2, util: 60 },
                        { i: 3, util: 90 },
                        { i: 4, util: 30 },
                        { i: 5, util: 50 },
                        { i: 6, util: 70 },
                        { i: 7, util: 20 },
                        { i: 8, util: 80 },
                        { i: 9, util: 100 }],
                "mem": [70, 70, 70, 70, 70, 70, 70, 70, 70, 70],
                "color": "#E8C750"
            }, {
                "label4": 'PC-4',
                "name": 'PC-4',
                "cpu": [
                        { i: 0, util: 30 },
                        { i: 1, util: 50 },
                        { i: 2, util: 90 },
                        { i: 3, util: 70 },
                        { i: 4, util: 80 },
                        { i: 5, util: 60 },
                        { i: 6, util: 40 },
                        { i: 7, util: 20 },
                        { i: 8, util: 100 },
                        { i: 9, util: 10 }],
                "mem": [60, 60, 60, 60, 60, 60, 60, 60, 60, 60],
                "color": "#59A36A"
            }];

            $scope.checkboxes = function(){
                d3.selectAll('.nvd3.nv-legend g');
            };

            $scope.Line = angular.copy($scope.graphLine);

            $scope.checkboxes = function () {
                $scope.name = [];
            };

            $scope.onchange = function () {
                $scope.Line = [];
                angular.forEach($scope.graphLine, function (i, util) {
                    if ($scope.checkboxes[value.cpu]) $scope.Line.push(value);
                })
            }

            $interval(function () {
                $scope.graphLine[0].cpu.shift();
                $scope.graphLine[1].cpu.shift();
                $scope.graphLine[2].cpu.shift();
                $scope.graphLine[3].cpu.shift();

                angular.forEach($scope.graphLine[0].cpu, function (item) {
                    item.i--;
                });
                angular.forEach($scope.graphLine[1].cpu, function (item) {
                    item.i--;
                });
                angular.forEach($scope.graphLine[2].cpu, function (item) {
                    item.i--;
                });
                angular.forEach($scope.graphLine[3].cpu, function (item) {
                    item.i--;
                });

                $scope.graphLine[0].cpu.push({ i: $scope.graphLine[0].cpu.length, util: Math.random() * 100 });
                $scope.graphLine[1].cpu.push({ i: $scope.graphLine[1].cpu.length, util: Math.random() * 100 });
                $scope.graphLine[2].cpu.push({ i: $scope.graphLine[2].cpu.length, util: Math.random() * 100 });
                $scope.graphLine[3].cpu.push({ i: $scope.graphLine[3].cpu.length, util: Math.random() * 100 });
            }, 1000)

        }]);

这是我的两个指令:

app.directive('linearChart1', function ($parse, $window, $interval) {
        return {
            restrict: 'EA',
            scope: {
                name: '=',
                cpu: '=',
                mem: '=',
                color: '=',
                graphLine: '='
            },
            template: "<svg width='1100' height='200'></svg>"+
                '{{graphLine.name}}{{graphLine.cpu}}{{graphLine.mem}}{{graphLine.color}}',
            link: function (scope, elem, attrs) {

                scope.graphLine = graphLine;

                var graphLine = ["name", "cpu", "mem", "color"];
                console.log(graphLine);

                var padding = 18;
                var pathClass = "path";
                var xScale, yScale, xAxisGen, yAxisGen, lineFun;

                var d3 = $window.d3;
                var rawSvg = elem.find('svg');
                var svg = d3.select(rawSvg[0]);

                //$interval(function () {
                //    setRandomValues(graphLine);

                //    redrawLineChart();
                //}, 1000, 1000);

                //scope.$watchCollection(exp, function (i, util) {
                //    GraphLineToPlot = util;
                //    data2 - util;
                //    redrawLineChart();
                //});

                function setChartParameters() {

                    var xMaximumPlot = 5;
                    var yMaximumPlot = 100;

                    xScale = d3.scale.linear()
                        .domain([0, xMaximumPlot])
                        .range([padding + 5, rawSvg.attr("width") - padding]);

                    yScale = d3.scale.linear()
                        .domain([0, yMaximumPlot])
                        .range([rawSvg.attr("height") - padding, 0]);

                    xAxisGen = d3.svg.axis()
                        .scale(xScale)
                        .orient("bottom")
                        .ticks(10);

                    yAxisGen = d3.svg.axis()
                        .scale(yScale)
                        .orient("left")
                        .ticks(5);

                    lineFun = d3.svg.line()
                        .x(function (d) {
                            return xScale(d.i);
                        })
                        .y(function (d) {
                            return yScale(d.util);
                        })
                        .interpolate("linear");
                }


                function drawLineChart() {

                    setChartParameters();

                    svg.append("svg:g")
                        .attr("class", "x axis")
                        .attr("transform", "translate(0,180)")
                        .call(xAxisGen);

                    svg.append("svg:g")
                        .attr("class", "y axis")
                        .attr("transform", "translate(20,0)")
                        .call(yAxisGen);


                    //svg.append("svg:path")
                    //    .attr({
                    //        d: linefun(scope.cpu),
                    //        "name": scope.name,
                    //        "stroke": scope.color,
                    //        "stroke-width": 2,
                    //        "fill": "none",
                    //        "class": pathclass
                    //    });
                }

                function redrawLineChart() {

                    setChartParameters();

                    svg.selectAll("g.y.axis").call(yAxisGen);

                    svg.selectAll("g.x.axis").call(xAxisGen);


                }

                //svg.select(".path").attr({
                //    d: lineFun(scope.cpu),
                //    "stroke": scope.color,
                //    "stroke-width": 2,
                //    "fill": "none",
                //    "class": pathClass
                //});

                $interval(function () {
                    redrawLineChart();
                }, 1000);

                drawLineChart();

            }
        };
    });

    app.directive('linearChart', function ($parse, $window, $interval) {
        return {
            restrict: 'EA',
            scope: {
                name: '=',
                color: '=',
                cpu: '=',
                mem: '='
            },
            template: "<svg width='1050' height='200'></svg>",
            link: function (scope, elem, attrs) {
                //var exp = $parse(attrs.chartData);

                var padding = 18;
                var pathClass = "path";
                var xScale, yScale, xAxisGen, yAxisGen, lineFun;

                var d3 = $window.d3;
                var rawSvg = elem.find('svg');
                var svg = d3.select(rawSvg[0]);

                //$interval(function () {
                //setRandomValues(graphLine);

                //redrawLineChart();
                //}, 1000, 1000);

                function setChartParameters() {

                    var xMaximumPlot = 5;
                    var yMaximumPlot = 100;

                    xScale = d3.scale.linear()
                        .domain([0, xMaximumPlot])
                        .range([padding + 5, rawSvg.attr("width") - padding]);

                    yScale = d3.scale.linear()
                        .domain([0, yMaximumPlot])
                        .range([rawSvg.attr("height") - padding, 0]);

                    xAxisGen = d3.svg.axis()
                        .scale(xScale)
                        .orient("bottom")
                        .ticks(10);

                    yAxisGen = d3.svg.axis()
                        .scale(yScale)
                        .orient("left")
                        .ticks(5);

                    lineFun = d3.svg.line()
                        .x(function (d) {
                            return xScale(d.i);
                        })
                        .y(function (d) {
                            return yScale(d.util);
                        })
                        .interpolate("basis");

                }

                function drawLineChart() {

                    setChartParameters();

                    svg.append("svg:g")
                        .attr("class", "x axis")
                        .attr("transform", "translate(0,180)")
                        .call(xAxisGen);

                    svg.append("svg:g")
                        .attr("class", "y axis")
                        .attr("transform", "translate(20,0)")
                        .call(yAxisGen);


                    svg.append("svg:path")
                        .attr({
                            d: lineFun(scope.cpu),
                            "name": scope.name,
                            "stroke": scope.color,
                            "stroke-width": 2,
                            "fill": "none",
                            "class": pathClass
                        });

                    //svg.append("svg:path")
                    //   .attr({
                    //       d: lineFun(scope.cpu),
                    //       "name": scope.name,
                    //       "stroke": "#586FFF",
                    //       "stroke-width": 2,
                    //       "fill": "none",
                    //       "class": pathClass
                    //   });

                    //svg.append("svg:path")
                    //    .attr({
                    //        d: lineFun(scope.cpu),
                    //        "name": scope.name,
                    //        "stroke": "#E8C750",
                    //        "stroke-width": 2,
                    //        "fill": "none",
                    //        "class": pathClass,
                    //    });

                    //svg.append("svg:path")
                    //   .attr({
                    //       d: lineFun(scope.cpu),
                    //       "name": scope.name,
                    //       "stroke": "#59A36A",
                    //       "stroke-width": 2,
                    //       "fill": "none",
                    //       "class": pathClass
                    //   });
                }

                function redrawLineChart() {

                    setChartParameters();

                    svg.selectAll("g.y.axis").call(yAxisGen);

                    svg.selectAll("g.x.axis").call(xAxisGen);

                    svg.select(".path").attr({
                        d: lineFun(scope.cpu),
                        "stroke": scope.color,
                        "stroke-width": 2,
                        "fill": "none",
                        "class": pathClass
                    });

                    //svg.select(".path").attr({
                    //    d: lineFun(scope.cpu),
                    //    "stroke": "#586FFF",
                    //    "stroke-width": 2,
                    //    "fill": "none",
                    //    "class": pathClass
                    //});

                    //svg.select(".path").attr({
                    //    d: lineFun(scope.cpu),
                    //    "stroke": "#E8C750",
                    //    "stroke-width": 2,
                    //    "fill": "none",
                    //    "class": pathClass
                    //});

                    //svg.select(".path").attr({
                    //    d: lineFun(scope.cpu),
                    //    "stroke": "#59A36A",
                    //    "stroke-width": 2,
                    //    "fill": "none",
                    //    "class": pathClass
                    //});
                }

                $interval(function () {
                    redrawLineChart();
                }, 1000);

                drawLineChart();
            }
        };
    });
4

0 回答 0