From 6be41c231bd681ca5dae8329fa4edc06e3f6abd4 Mon Sep 17 00:00:00 2001 From: 100pah Date: Mon, 13 Jan 2020 14:20:09 +0800 Subject: [PATCH] fix: fix candlestick throw error when some series filtered by legend. fix #11611 --- src/chart/candlestick/candlestickVisual.js | 2 +- src/chart/helper/createRenderPlanner.js | 7 +- src/stream/Scheduler.js | 8 ++ test/stream-filter2.html | 155 +++++++++++++++++++++ 4 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 test/stream-filter2.html diff --git a/src/chart/candlestick/candlestickVisual.js b/src/chart/candlestick/candlestickVisual.js index c645eddbc8..44bfd17a91 100644 --- a/src/chart/candlestick/candlestickVisual.js +++ b/src/chart/candlestick/candlestickVisual.js @@ -36,7 +36,6 @@ export default { reset: function (seriesModel, ecModel) { var data = seriesModel.getData(); - var isLargeRender = seriesModel.pipelineContext.large; data.setVisual({ legendSymbol: 'roundRect', @@ -51,6 +50,7 @@ export default { return; } + var isLargeRender = seriesModel.pipelineContext.large; return !isLargeRender && {progress: progress}; diff --git a/src/chart/helper/createRenderPlanner.js b/src/chart/helper/createRenderPlanner.js index 01655d0e48..0fc5041407 100644 --- a/src/chart/helper/createRenderPlanner.js +++ b/src/chart/helper/createRenderPlanner.js @@ -32,8 +32,11 @@ export default function () { var originalLarge = fields.large; var originalProgressive = fields.progressiveRender; - var large = fields.large = pipelineContext.large; - var progressive = fields.progressiveRender = pipelineContext.progressiveRender; + // FIXME: if the planner works on a filtered series, `pipelineContext` does not + // exists. See #11611 . Probably we need to modify this structure, see the comment + // on `performRawSeries` in `Schedular.js`. + var large = fields.large = pipelineContext && pipelineContext.large; + var progressive = fields.progressiveRender = pipelineContext && pipelineContext.progressiveRender; return !!((originalLarge ^ large) || (originalProgressive ^ progressive)) && 'reset'; }; diff --git a/src/stream/Scheduler.js b/src/stream/Scheduler.js index ce28e0e211..ce34db5cae 100644 --- a/src/stream/Scheduler.js +++ b/src/stream/Scheduler.js @@ -260,6 +260,14 @@ function performStageTasks(scheduler, stageHandlers, ecModel, payload, opt) { task.dirty(); } var performArgs = scheduler.getPerformArgs(task, opt.block); + // FIXME + // if intending to decalare `performRawSeries` in handlers, only + // stream-independent (specifically, data item independent) operations can be + // performed. Because is a series is filtered, most of the tasks will not + // be performed. A stream-dependent operation probably cause wrong biz logic. + // Perhaps we should not provide a separate callback for this case instead + // of providing the config `performRawSeries`. The stream-dependent operaions + // and stream-independent operations should better not be mixed. performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model); updatePayload(task, payload); diff --git a/test/stream-filter2.html b/test/stream-filter2.html new file mode 100644 index 0000000000..1634593227 --- /dev/null +++ b/test/stream-filter2.html @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +