From 536f61f46c5cf93f608f0f030c891b7199f7238a Mon Sep 17 00:00:00 2001 From: pah100 Date: Tue, 1 Sep 2015 17:51:52 +0800 Subject: [PATCH] save / restore data, legend problem --- src/chart/line/LineSeries.js | 2 + src/chart/scatter/ScatterSeries.js | 2 + src/component/dataZoom/DataZoomView.js | 9 +- src/component/dataZoom/dataZoomAction.js | 10 ++- src/component/dataZoom/dataZoomProcessor.js | 6 +- src/component/dataZoom/helper.js | 77 ++++++++++++++++ src/component/legend/LegendView.js | 2 +- src/echarts.js | 4 +- src/model/Global.js | 58 ++++++------- src/model/Model.js | 12 ++- src/model/Series.js | 14 +-- src/view/Chart.js | 7 ++ src/view/Component.js | 7 ++ test/ut/all.js | 3 +- .../common/helper.js => core/utHelper.js} | 22 +++++ test/ut/lib/jasmine-2.3.4/jasmine.css | 2 +- test/ut/spec/dataZoom/helper.js | 87 +++++++++++++++++++ 17 files changed, 266 insertions(+), 58 deletions(-) rename test/ut/{spec/common/helper.js => core/utHelper.js} (85%) create mode 100755 test/ut/spec/dataZoom/helper.js diff --git a/src/chart/line/LineSeries.js b/src/chart/line/LineSeries.js index f93c92ba0..3bfe52364 100644 --- a/src/chart/line/LineSeries.js +++ b/src/chart/line/LineSeries.js @@ -9,6 +9,8 @@ define(function(require) { type: 'series.line', + dependencies: ['xAxis', 'yAxis'], + getInitialData: function (option, ecModel) { return List.fromArray(option.data, this, ecModel); }, diff --git a/src/chart/scatter/ScatterSeries.js b/src/chart/scatter/ScatterSeries.js index 681ebf5bc..39dce3aad 100644 --- a/src/chart/scatter/ScatterSeries.js +++ b/src/chart/scatter/ScatterSeries.js @@ -9,6 +9,8 @@ define(function (require) { type: 'series.scatter', + dependencies: ['xAxis', 'yAxis'], + getInitialData: function (option, ecModel) { return List.fromArray(option.data, this, ecModel); }, diff --git a/src/component/dataZoom/DataZoomView.js b/src/component/dataZoom/DataZoomView.js index 0440d73b1..e47c595cd 100644 --- a/src/component/dataZoom/DataZoomView.js +++ b/src/component/dataZoom/DataZoomView.js @@ -3,7 +3,6 @@ define(function (require) { var echarts = require('../../echarts'); var zrUtil = require('zrender/core/util'); var helper = require('./helper'); - var unique = require('../../util/unique'); var retrieveValue = helper.retrieveValue; // Constants @@ -16,7 +15,6 @@ define(function (require) { init: function (echarts) { this._location; - this._uid = unique.getUID('dataZoomView'); }, render: function (dataZoomModel, ecModel, api, event) { @@ -29,7 +27,7 @@ define(function (require) { this._api = api; this._orient = dataZoomModel.get('orient'); - if (!event || event.type !== 'dataZoom' || event.from !== this._uid) { + if (!event || event.type !== 'dataZoom' || event.from !== this.uid) { this.group.clear(); if (this.dataZoomModel.get('show') === false) { @@ -300,8 +298,9 @@ define(function (require) { this._api.dispatch({ type: 'dataZoom', - from: this._uid, - param: this._normalizeToRange() + from: this.uid, + param: this._normalizeToRange(), + targetModel: this._dataZoomModel }); // FIXME diff --git a/src/component/dataZoom/dataZoomAction.js b/src/component/dataZoom/dataZoomAction.js index 93fe43e37..dfa04f568 100644 --- a/src/component/dataZoom/dataZoomAction.js +++ b/src/component/dataZoom/dataZoomAction.js @@ -8,7 +8,8 @@ define(function(require) { var echarts = require('../../echarts'); var helper = require('./helper'); - echarts.registerAction(function (event, ecModel) { + echarts.registerAction('dataZoom', function (event, ecModel) { + var sourceDataZoomModel = event.targetModel; ecModel.eachComponent('dataZoom', zrUtil.curry(processSingleDataZoom, event, ecModel)); }); @@ -21,4 +22,11 @@ define(function(require) { }); } + function processSingleAxis(ecModel, dataZoomModel, dimNames, axisIndex) { + } + + function isSharingAxis(dataZoomModel0, dataZoomModel1) { + + } + }); \ No newline at end of file diff --git a/src/component/dataZoom/dataZoomProcessor.js b/src/component/dataZoom/dataZoomProcessor.js index f7f64d66d..b767cd396 100644 --- a/src/component/dataZoom/dataZoomProcessor.js +++ b/src/component/dataZoom/dataZoomProcessor.js @@ -62,11 +62,13 @@ define(function (require) { // 这里仅仅处理了list类型 var seriesData = seriesModel.getData(); seriesModel.setData( - seriesData['filter' + dimNames.dim.toUpperCase()](start, end) + seriesData['filter' + dimNames.dim.toUpperCase()](function (value) { + return value >= start && value <= end; + }) ); // FIXME - // 对于数值轴,还要考虑log等情况 + // 对于数值轴,还要考虑log等情况. // FIXME // 对于时间河流图,还要考虑是否须整块移除。 }); diff --git a/src/component/dataZoom/helper.js b/src/component/dataZoom/helper.js index 246446f21..2971934a8 100644 --- a/src/component/dataZoom/helper.js +++ b/src/component/dataZoom/helper.js @@ -48,5 +48,82 @@ define(function(require) { return zrUtil.isArray(value) ? value : (value == null ? [] : [value]); }; + /** + * @public + */ + helper.findLinkSet = function (forEachModel, axisIndicesGetter, sourceModel) { + var result = {models: [], dims: {}}; + var dimRecords = {}; + helper.eachAxisDim(function (dimNames) { + result.dims[dimNames.dim] = []; + dimRecords[dimNames.dim] = []; + }); + + if (!sourceModel) { + return result; + } + + absorb(sourceModel); + + var existsLink; + do { + existsLink = false; + forEachModel(processSingleModel); + } + while (existsLink); + + wrapUpResult(); + + return result; + + function processSingleModel(model) { + if (!isModelAbsorded(model) && isLink(model)) { + absorb(model); + existsLink = true; + } + } + + function isModelAbsorded(model) { + return zrUtil.indexOf(result.models, model) >= 0; + } + + function isLink(model) { + var hasLink = false; + helper.eachAxisDim(function (dimNames) { + var axisIndices = axisIndicesGetter(model, dimNames); + var singleDimSet = dimRecords[dimNames.dim]; + for (var i = 0, len = axisIndices.length; i < len; i++) { + if (singleDimSet[axisIndices[i]]) { + hasLink = true; + return; + } + } + }); + return hasLink; + } + + function absorb(model) { + result.models.push(model); + helper.eachAxisDim(function (dimNames) { + var axisIndices = axisIndicesGetter(model, dimNames); + var singleDimSet = dimRecords[dimNames.dim]; + for (var i = 0, len = axisIndices.length; i < len; i++) { + singleDimSet[axisIndices[i]] = true; + } + }); + } + + function wrapUpResult() { + helper.eachAxisDim(function (dimNames) { + var dimRecord = dimRecords[dimNames.dim]; + for (var i = 0; i < dimRecord.length; i++) { + if (dimRecord[i]) { + result.dims[dimNames.dim].push(i); + } + } + }); + } + }; + return helper; }); \ No newline at end of file diff --git a/src/component/legend/LegendView.js b/src/component/legend/LegendView.js index 768cd875b..eabe78b47 100644 --- a/src/component/legend/LegendView.js +++ b/src/component/legend/LegendView.js @@ -34,7 +34,7 @@ define(function (require) { legendModel.getData().each(function (dataItem) { var seriesName = dataItem.name; - var seriesModel = ecModel.getSeriesByName(seriesName); + var seriesModel = ecModel.getSeriesByName(seriesName, true); var color = legendModel.isSelected(seriesName) ? seriesModel.getVisual('color') : '#ccc'; diff --git a/src/echarts.js b/src/echarts.js index d6f08ebba..0cb02d14c 100644 --- a/src/echarts.js +++ b/src/echarts.js @@ -159,9 +159,7 @@ define(function (require) { var ecModel = this._model; - ecModel.restore(); - - ecModel.save(); + ecModel.restoreData(); this._processData(ecModel); diff --git a/src/model/Global.js b/src/model/Global.js index 0dc179733..d33b6a018 100644 --- a/src/model/Global.js +++ b/src/model/Global.js @@ -48,6 +48,12 @@ define(function (require) { */ this._componentsMap = {}; + /** + * @type {Object.} + * @private + */ + this._componentsMapBeforeProcessing = {}; + /** * @type {module:echarts/model/Model} * @private @@ -149,6 +155,11 @@ define(function (require) { } } }, this); + + // Backup data + zrUtil.each(componentsMap, function (components, componentType) { + this._componentsMapBeforeProcessing[componentType] = components.slice(); + }, this); }, /** @@ -179,10 +190,13 @@ define(function (require) { /** * @param {string} name + * @param {boolean} beforeProcessing * @return {module:echarts/model/Series} */ - getSeriesByName: function (name) { - var series = this._componentsMap.series; + getSeriesByName: function (name, beforeProcessing) { + var series = beforeProcessing + ? this._componentsMapBeforeProcessing.series + : this._componentsMap.series; for (var i = 0, len = series.length; i < len; i++) { // name should be unique. if (series[i].name === name) { @@ -238,36 +252,20 @@ define(function (require) { ); }, - save: function () { - var seriesList = this._componentsMap.series; - this._stack.push({ - series: seriesList.slice() - }); - - var components = this._components; - var i; - for (i = 0; i < components.length; i++) { - components[i].save(); - } - for (i = 0; i < seriesList.length; i++) { - seriesList[i].save(); - } - }, + restoreData: function () { + var componentsMap = this._componentsMap; + var componentTypes = []; - restore: function () { - if (this._stack.length) { - this._componentsMap.series = this._stack.pop().series; - } + zrUtil.each(this._componentsMapBeforeProcessing, function (components, componentType) { + componentsMap[componentType] = components.slice(); + componentTypes.push(componentType); + }); - var seriesList = this._componentsMap.series; - var components = this._components; - var i; - for (i = 0; i < components.length; i++) { - components[i].restore(); - } - for (i = 0; i < seriesList.length; i++) { - seriesList[i].restore(); - } + ComponentModel.topologicalTravel(componentTypes, function (componentType, dependencies) { + zrUtil.each(componentsMap[componentType], function (component) { + component.restoreData(); + }); + }); }, /** diff --git a/src/model/Model.js b/src/model/Model.js index 97a3004cc..f9ac9bf3a 100644 --- a/src/model/Model.js +++ b/src/model/Model.js @@ -4,6 +4,7 @@ define(function (require) { var zrUtil = require('zrender/core/util'); + var unique = require('../util/unique'); /** * @alias module:echarts/model/Model @@ -37,6 +38,13 @@ define(function (require) { */ this.dependentModels = dependentModels; + /** + * @type {string} + * @public + * @readOnly + */ + this.uid = unique.getUID('model'); + this.init.apply(this, arguments); } @@ -133,9 +141,7 @@ define(function (require) { this._visual[key] = val; }, - save: function () {}, - - restore: function () {}, + restoreData: function () {}, // Pending clone: function () { diff --git a/src/model/Series.js b/src/model/Series.js index 35d6f9152..c10cdc1c9 100644 --- a/src/model/Series.js +++ b/src/model/Series.js @@ -49,7 +49,7 @@ define(function(require) { */ this._data = this.getInitialData(option, ecModel); - this._stack = []; + this._dataBeforeProcessing = this._data.clone(); }, mergeDefaultAndTheme: function (option, ecModel) { @@ -74,16 +74,8 @@ define(function(require) { return this._data; }, - save: function () { - this._stack.push({ - data: this._data.clone() - }); - }, - - restore: function () { - if (this._stack.length) { - this._data = this._stack.pop().data; - } + restoreData: function () { + this._data = this._dataBeforeProcessing.clone(); } }); diff --git a/src/view/Chart.js b/src/view/Chart.js index 7c3e6484c..b6b46498c 100644 --- a/src/view/Chart.js +++ b/src/view/Chart.js @@ -2,6 +2,7 @@ define(function (require) { var zrUtil = require('zrender/core/util'); var Group = require('zrender/container/Group'); + var unique = require('../util/unique'); function Chart() { @@ -10,6 +11,12 @@ define(function (require) { * @readOnly */ this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = unique.getUID('viewChart'); } Chart.prototype = { diff --git a/src/view/Component.js b/src/view/Component.js index cb3a3a1b4..717c1b440 100644 --- a/src/view/Component.js +++ b/src/view/Component.js @@ -2,6 +2,7 @@ define(function (require) { var zrUtil = require('zrender/core/util'); var Group = require('zrender/container/Group'); + var unique = require('../util/unique'); var Component = function () { /** @@ -9,6 +10,12 @@ define(function (require) { * @readOnly */ this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = unique.getUID('viewComponent'); }; Component.prototype = { diff --git a/test/ut/all.js b/test/ut/all.js index 247b3bf6c..56d5d8e55 100755 --- a/test/ut/all.js +++ b/test/ut/all.js @@ -1,4 +1,5 @@ -document.write('