gpt4 book ai didi

javascript - 动态更新指令数据

转载 作者:行者123 更新时间:2023-12-02 14:03:23 24 4
gpt4 key购买 nike

抱歉,也许这是一个愚蠢的问题,但我仍在学习。

我正在尝试使用 angularJS 中的 D3.js 制作一个简单的折线图。一切工作正常,因为我正在使用自定义指令来使用 D3 绘制图表。我使用 $scope 在 Controller 本身中添加图表数据。最初它会绘制,但我将一键单击更改数据,但图表不会自动更新,

阅读完 AngularJS 文档后,我明白通过使用 $scope 我们可以动态更改 UI 内容。这里是否可能或 AngularJs 中存在任何其他场景

我是 AngularJS 的初学者

  <div  data-ng-app="chartApp" data-ng-controller="SalesController">
<h1>Today's Sales Chart</h1>
<div linear-chart chart-data="salesData"></div>
<button type="button" data-ng-click="Change()">Click Me!</button>
</div>

我的JS代码

 var app = angular.module('chartApp', []);
app.controller('SalesController', ['$scope', function($scope){
$scope.salesData=[
{hour: 1,sales: 54},
{hour: 2,sales: 66},
{hour: 3,sales: 77},
{hour: 4,sales: 70},
{hour: 5,sales: 60},
{hour: 6,sales: 63},
{hour: 7,sales: 55},
{hour: 8,sales: 47},
{hour: 9,sales: 55},
{hour: 10,sales: 30}
];
$scope.Change = function () {
//here i am changing the data so i need to replot the chart
$scope.salesData=[
{hour: 1,sales: 14},
{hour: 2,sales: 16},
{hour: 3,sales: 77},
{hour: 4,sales: 10},
{hour: 5,sales: 60},
{hour: 6,sales: 63},
{hour: 7,sales: 55},
{hour: 8,sales: 47},
{hour: 9,sales: 55},
{hour: 10,sales: 30}
];
}
}]);
//creating one custom directive to plot the chart
app.directive('linearChart', function($window){
return{
restrict:'EA',
template:"<svg width='850' height='200'></svg>",
link: function(scope, elem, attrs){
var salesDataToPlot=scope[attrs.chartData];
//if u gave like this u can remove attributr chart-data
// var salesDataToPlot=scope.salesData
var padding = 20;
var pathClass="path";
var xScale, yScale, xAxisGen, yAxisGen, lineFun;

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

function setChartParameters(){

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

yScale = d3.scale.linear()
.domain([0, d3.max(salesDataToPlot, function (d) {
return d.sales;
})])
.range([rawSvg.attr("height") - padding, 0]);

xAxisGen = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.ticks(salesDataToPlot.length - 1);

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

lineFun = d3.svg.line()
.x(function (d) {
return xScale(d.hour);
})
.y(function (d) {
return yScale(d.sales);
})
.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(salesDataToPlot),
"stroke": "blue",
"stroke-width": 2,
"fill": "none",
"class": pathClass
});
}
drawLineChart();
}
};
});

Fiddle

最佳答案

这是一个活生生的例子: http://jsfiddle.net/7dc3efrc/1/

scope.$watch(attrs.chartData, function(newValue) {
if (newValue) {
svg.selectAll("*").remove();
drawLineChart(newValue);
}
}, true);

使用范围的 $watch 方法来触发模型更改的更新。另外,如果不需要的话,请不要忘记清除以前的图表(svg.selectAll("*").remove())。

请参阅完整示例,因为我对您的 salesDataToPlot 变量进行了一些细微修改(它现在是一个函数参数)。

关于javascript - 动态更新指令数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40220561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com