차트를 동적으로 추가 및 제거 할 수있는 응용 프로그램을 만들고 있습니다. 모든 것은 잘 작동하지만 차트를 삭제합니다.dc.js : dispose() 및 deregisterChart() 문제
꺾은 선형 차트와 막대 차트 중 하나가 복합 요소 일 때 문제가 발생하고 그 중 하나를 삭제합니다 (차원을 삭제하고 차트 등록 취소). 이 시점에서 내가 처리하지 않은 차트는 다른 차트의 필터에 반응을 멈추고 자체 이벤트에 반응을 멈추더라도 다른 차트가 필터로 필터링되었다고 생각했습니다. 또한 바이올린에서 볼 수 있듯이 DC에서 제거한 선형 차트는 다른 차트 필터에도 계속 반응합니다.
나는이 문제가 deregisterChart dc 호출에 있다는 것을 알았지 만, 내 응용 프로그램이 무한대 차트를 만들고 삭제할 수 있기 때문에 뒤에 남겨진 것들을 깨지 않고 직류에서 제거 할 방법이 필요하다. https://jsfiddle.net/nofknndf/9/
감사 :
resetFilter = function() {
lineData.dispose()
dc.deregisterChart(linechart);
}
for (var j = 0; j < axis.length; j++) {
var dimData = __cfArray[dataId].dimension(function(d) {
return d[axis[j].xaxis];
});
var barGroup = getGroup(dimData, axis[j].xaxis, axis[j].yaxis, operation, isDate);
barCharts.push(dc.barChart(composite)
.valueAccessor(accesor)
.dimension(dimData)
.group(barGroup, xAxisTitle[j])
.transitionDuration(1000)
.gap(gap)
.colors(barColors[j])
.centerBar(function() {
if (axis.length > 1) return false;
else return true;
})
.title(function(d) {
if (operation === count) {
if (isDate) return format(d.key) + ": " + d.value.count;
else return d.key + ": " + d.value.count;
} else {
if (isDate) return format(d.key) + ": " + d.value.total;
else return d.key + ": " + d.value.total;
}
})
);
lineData = __cfArray[dataId].dimension(function(d) {
return d[axis[j].xaxis];
});
var lineGroup = getGroupLine(lineData, axis[j].xaxis, axis[j].yaxis, true, operation, isDate);
linechart = dc.lineChart(lineDom)
.dimension(lineData)
.group(lineGroup, xAxisTitle[j] + "/" + yAxisTitle)
.useRightYAxis(true)
.colors(lineColors[j])
.title(function(d) {
if (operation === count) {
if (isDate) return format(d.key) + ": " + d.valueCount;
else return d.key + ": " + d.valueCount;
} else {
if (isDate) return format(d.key) + ": " + d.valueTotal;
else return d.key + ": " + d.valueTotal;
}
})
.valueAccessor(function(p) {
if (operation === count) {
return p.valueCount;
} else {
return p.valueTotal;
}
});
}
var xMine;
var dom = [];
for (var i = 0; i < axis.length; i++) {
if (dom.length === 0) {
dom = __dataArray[dataId].map(function(d) {
return d[axis[i].xaxis]
});
} else {
dom = dom.concat(__dataArray[dataId].map(function(d) {
return d[axis[i].xaxis]
}));
}
}
if (isNaN(dom[0])) {
xMine = d3.scale.ordinal().domain(dom.sort());
} else {
xMine = d3.scale.ordinal().domain(dom.sort(function(a, b) {
return a - b;
}));
}
composite.xUnits(dc.units.ordinal)
linechart.xUnits(dc.units.ordinal)
linechart.width(width)
.height(height)
.margins(margin)
.x(xMine)
.elasticY(true)
.legend(dc.legend().x(80).y(10).itemHeight(13).gap(5))
._rangeBandPadding(1)
.brushOn(false);
composite.width(width)
.height(height)
.margins(margin)
.x(xMine)
.rightYAxisLabel(yAxisRightTitle)
.elasticY(true)
.legend(dc.legend().x(80).y(10).itemHeight(13).gap(5))
._rangeBandPadding(1)
.brushOn(false)
.shareTitle(false)
.mouseZoomable(true)
.yAxisPadding('10%')
.compose(barCharts)
.renderHorizontalGridLines(true);
composite.yAxis().tickFormat(d3.format('s'));
composite.rightYAxis().tickFormat(d3.format('s'));
composite.render();
linechart.render();
이것은 내가 내 문제로 만든 바이올린은 다음과 같습니다
이 코드입니다!
안녕 고든, 당신의 도움을 주셔서 감사하지만 여전히 제대로 작동하지 않습니다.피들에서 볼 수 있듯이 처분 버튼을 클릭하면 막 대형 차트는 더 이상 필터링 할 이벤트를 클릭하지 않습니다. 어쨌든, 여분의 그룹을 만들지 않으면 나는 많은 차트를 동적으로 생성하므로 좋은 단계입니다. 어쨌든, 현재 해결 방법은 그룹 및 차원 (차트 제외) 제거하는 것입니다 그래서 기존 차트로 필터링 너무 비싸지 않습니다. – ruba
아, 미안, 그 부분을 놓쳤다. 추적하고 지금 내 대답을 업데이트하고 있습니다. – Gordon
안녕하세요. 업데이트에 다시 한 번 감사드립니다. 고유 한 ID 문제를 이해하고이 함수를 여러 번 호출하기 때문에이 코드에서 문제가 될 수 있다고 생각합니다. 그러나 한 차트를 합성이라고하고 다른 차트를 linechart라고하기 때문에 차트를 한 번만 만드는 경우 예제에서이 문제가 나타나지 않습니다. – ruba