Я визуализировал штабелированную панель, а затем я пытаюсь повторно рисовать диаграмму с помощью нового фильтра при нажатии кнопки. Теперь, когда я нажимаю кнопку, предыдущие оси остаются, но диаграмма исчезает и не перерисовывается. Я не знаю, чего мне здесь не хватает. Вот JSFiddle для этого stackedBar.dc.js: фильтр и диаграмма перерисовывания по клику
function myFunc(){
var dimForHour = cf.dimension(function(d) { return d.date; });
dimForHour.filter([hour, today]);
var dimByChannel = cf.dimension(function(d) { return d.channelUUID; });
var groupAvgChan = dimByChannel.group().reduce(
function reduceAdd(p, v) {
p.bytesTxd = p.bytesTxd + v.bytesTxd;
p.count = p.count + 1;
p.avg = p.bytesTxd/p.count;
p.avgTot = p.avgTot + p.avg;
p.avgPrcnt = (p.avg/p.avgTot) * 100;
if(p.max < v.bytesTxd) { p.max = v.bytesTxd; }
p.maxTot = p.maxTot + p.max;
p.maxPrcnt = (p.max/p.maxTot) * 100;
return p;
},
function reduceRemove(p, v) {
p.bytesTxd = p.bytesTxd - v.bytesTxd;
p.count = p.count - 1;
p.avg = p.bytesTxd/p.count;
p.avgTot = p.avgTot - v.avgTot;
p.avgPrcnt = (p.avg/p.avgTot) * 100;
if(p.max > v.bytesTxd) { p.max = v.bytesTxd; }
p.maxTot = p.maxTot - p.max;
p.maxPrcnt = (p.max/p.maxTot) * 100;
return p;
},
function reduceInitial() {
return {
bytesTxd:0, count:0, avg:0, avgTot:0,
avgPrcnt:0, max:0, maxTot:0,maxPrcnt:0};
});
/*chanUtil = dc.barChart("#chanUtil")
chanUtil
.dimension(dimByChannel)
.group(groupAvgChan,"Avg Utilization %").valueAccessor(function(d) { return d.value.avgPrcnt; })
.stack(groupAvgChan,"Max Utilization %", function(d) { return d.value.maxPrcnt; })
.x(d3.scale.ordinal().domain(data.map(function (d) { return d.channelUUID })))
.xUnits(dc.units.ordinal);*/
dc.redrawAll();
}
NaNs - общий способ получить пустую диаграмму. Правильно, вам не нужно будет воссоздавать какие-либо измерения или группы, которые не изменились. – Gordon
Для того же кода, когда я добавил фильтры для 'day',' week' и 'month', похоже, что фильтры из предыдущего события клика не очищаются. Я попытался использовать функции 'filterAll()' и 'dispose()' без успеха. [JSFiddle] (https://jsfiddle.net/iSudeep/qssszL8u/) – Greenhorn
Обычно вы хотите избежать создания измерений и групп в ответ на события. Существует ограниченное количество измерений, и каждый из них замедляет кроссфильтр. Я бы предложил создать измерение за один день/неделю/месяц вне обработчика событий, а затем сбросить его и снова установить внутри. Наличие нескольких измерений может объяснить, почему вы не видите сброс. – Gordon