Angular.js 点击 angular-bootstrap-下拉菜单时图表重绘
Angular.js chart redraws when clicking on angular-bootstrap-dropdown
我遇到了 angular-chartjs
的问题,这让我很生气。
我在 旁边有一个 bootstrap 下拉菜单(使用 angular-ui-bootstrap
),由 angular-chartjs
使用。
当图表的数据源中的项目超过 7 个时,单击下拉菜单会使图表重绘一次。我找不到解释为什么会这样。
Jsfiddle:https://jsfiddle.net/vz4qhqpw/378/
转到第二个选项卡并单击下拉菜单。图表将重新绘制。现在转到 javascript 代码并将最后一行更改为调用 updateData2()
而不是 updateData()
,问题就消失了。在 updateData2()
中向数组添加超过 7 个项目也会导致问题发生。
怎么回事?
尝试为每个图表明确提供图表颜色(例如,生成一组随机颜色并将其传递给每个图表):
<!-- added chart-colors attribute -->
<canvas class="chart chart-base"
chart-options="categories[heading].options"
chart-type="categories[heading].chartType"
chart-data="categories[heading].data"
chart-labels="categories[heading].labels"
chart-colors="categories[heading].colors"
height="130">
</canvas>
查看我对您的 fiddle 的更正版本:https://jsfiddle.net/s8pe2rrf/2/
解释:
查看angular-chart.js源代码,您可能会看到该指令为每个属性添加了监视,包括chart-colors
scope.$watch('chartColors', watchOther, true);
并在更改属性值时重新创建图表。
如果您一开始没有指定颜色,则使用默认的颜色数组,其中包含 7 个项目(这就是魔法 7 的来源!):
Chart.defaults.global.colors = [
'#97BBCD', // blue
'#DCDCDC', // light grey
'#F7464A', // red
'#46BFBD', // green
'#FDB45C', // yellow
'#949FB1', // grey
'#4D5360' // dark grey
];
当您的图表包含超过 7 个项目时,chart.js 会根据需要在内部添加额外的颜色。
看起来这会触发上面提到的侦听器。
但是为什么在选择下拉菜单时会发生这种情况?
Chart.js 不是本机 Angular 库(它通过 "proxy"、angular-chart.js 使用),所以看起来像
该指令不知道新值正在添加到颜色数组中,因此触发了侦听器
只有在下次调用 $apply 时,这恰好是点击下拉菜单。
我遇到了 angular-chartjs
的问题,这让我很生气。
我在 旁边有一个 bootstrap 下拉菜单(使用 angular-ui-bootstrap
),由 angular-chartjs
使用。
当图表的数据源中的项目超过 7 个时,单击下拉菜单会使图表重绘一次。我找不到解释为什么会这样。
Jsfiddle:https://jsfiddle.net/vz4qhqpw/378/
转到第二个选项卡并单击下拉菜单。图表将重新绘制。现在转到 javascript 代码并将最后一行更改为调用 updateData2()
而不是 updateData()
,问题就消失了。在 updateData2()
中向数组添加超过 7 个项目也会导致问题发生。
怎么回事?
尝试为每个图表明确提供图表颜色(例如,生成一组随机颜色并将其传递给每个图表):
<!-- added chart-colors attribute -->
<canvas class="chart chart-base"
chart-options="categories[heading].options"
chart-type="categories[heading].chartType"
chart-data="categories[heading].data"
chart-labels="categories[heading].labels"
chart-colors="categories[heading].colors"
height="130">
</canvas>
查看我对您的 fiddle 的更正版本:https://jsfiddle.net/s8pe2rrf/2/
解释:
查看angular-chart.js源代码,您可能会看到该指令为每个属性添加了监视,包括chart-colors
scope.$watch('chartColors', watchOther, true);
并在更改属性值时重新创建图表。
如果您一开始没有指定颜色,则使用默认的颜色数组,其中包含 7 个项目(这就是魔法 7 的来源!):
Chart.defaults.global.colors = [
'#97BBCD', // blue
'#DCDCDC', // light grey
'#F7464A', // red
'#46BFBD', // green
'#FDB45C', // yellow
'#949FB1', // grey
'#4D5360' // dark grey
];
当您的图表包含超过 7 个项目时,chart.js 会根据需要在内部添加额外的颜色。 看起来这会触发上面提到的侦听器。
但是为什么在选择下拉菜单时会发生这种情况? Chart.js 不是本机 Angular 库(它通过 "proxy"、angular-chart.js 使用),所以看起来像 该指令不知道新值正在添加到颜色数组中,因此触发了侦听器 只有在下次调用 $apply 时,这恰好是点击下拉菜单。