提交 a5fe2bc3 编写于 作者: P pah100

(I was originally planned to add dataType in click event, but finally modified...

(I was originally planned to add dataType in click event, but finally modified quite a few files. Did I go too far?)
Add `dataType` to data and `getFormattedLabel` `getDataParams` `graphicEl`.
Enable series to maintain multiple datas (ig: in GraphSeries and SankeySeries).
Enable multiple datas sync when restoreData without trick in Graph.js.
Enable tooltip and click of edgeData without creating special dataModel.
上级 fc999a78
...@@ -24,7 +24,6 @@ define(function (require) { ...@@ -24,7 +24,6 @@ define(function (require) {
this.fillDataTextStyle(option.edges || option.links); this.fillDataTextStyle(option.edges || option.links);
this._updateCategoriesData(); this._updateCategoriesData();
this._updateEdgeDataModel();
}, },
mergeOption: function (option) { mergeOption: function (option) {
...@@ -33,7 +32,6 @@ define(function (require) { ...@@ -33,7 +32,6 @@ define(function (require) {
this.fillDataTextStyle(option.edges || option.links); this.fillDataTextStyle(option.edges || option.links);
this._updateCategoriesData(); this._updateCategoriesData();
this._updateEdgeDataModel();
}, },
mergeDefaultAndTheme: function (option) { mergeDefaultAndTheme: function (option) {
...@@ -44,12 +42,13 @@ define(function (require) { ...@@ -44,12 +42,13 @@ define(function (require) {
getInitialData: function (option, ecModel) { getInitialData: function (option, ecModel) {
var edges = option.edges || option.links || []; var edges = option.edges || option.links || [];
var nodes = option.data || option.nodes || []; var nodes = option.data || option.nodes || [];
var self = this;
if (nodes && edges) { if (nodes && edges) {
var graph = createGraphFromNodeEdge(nodes, edges, this, true); return createGraphFromNodeEdge(nodes, edges, this, true, beforeLink).data;
var nodeData = graph.data; }
var edgeData = graph.edgeData;
var self = this; function beforeLink(nodeData, edgeData) {
// Overwrite nodeData.getItemModel to // Overwrite nodeData.getItemModel to
nodeData.wrapMethod('getItemModel', function (model) { nodeData.wrapMethod('getItemModel', function (model) {
var categoriesModels = self._categoriesModels; var categoriesModels = self._categoriesModels;
...@@ -62,7 +61,7 @@ define(function (require) { ...@@ -62,7 +61,7 @@ define(function (require) {
return model; return model;
}); });
var edgeLabelModel = this.getModel('edgeLabel'); var edgeLabelModel = self.getModel('edgeLabel');
var wrappedGetEdgeModel = function (path, parentModel) { var wrappedGetEdgeModel = function (path, parentModel) {
var pathArr = (path || '').split('.'); var pathArr = (path || '').split('.');
if (pathArr[0] === 'label') { if (pathArr[0] === 'label') {
...@@ -78,20 +77,9 @@ define(function (require) { ...@@ -78,20 +77,9 @@ define(function (require) {
model.getModel = wrappedGetEdgeModel; model.getModel = wrappedGetEdgeModel;
return model; return model;
}); });
// Set edge data again to ensure the backup data has the wrapped method
// FIXME
graph.setEdgeData(edgeData);
return nodeData;
} }
}, },
restoreData: function () {
GraphSeries.superApply(this, 'restoreData', arguments);
this.getGraph().restoreData();
},
/** /**
* @return {module:echarts/data/Graph} * @return {module:echarts/data/Graph}
*/ */
...@@ -106,10 +94,6 @@ define(function (require) { ...@@ -106,10 +94,6 @@ define(function (require) {
return this.getGraph().edgeData; return this.getGraph().edgeData;
}, },
getEdgeDataModel: function () {
return this._edgeDataModel;
},
/** /**
* @return {module:echarts/data/List} * @return {module:echarts/data/List}
*/ */
...@@ -117,23 +101,25 @@ define(function (require) { ...@@ -117,23 +101,25 @@ define(function (require) {
return this._categoriesData; return this._categoriesData;
}, },
_updateEdgeDataModel: function () { /**
var graph = this.getGraph(); * @override
var edgeData = this.getEdgeData(); */
var data = this.getData(); formatTooltip: function (dataIndex, multipleSeries, dataType) {
this._edgeDataModel = modelUtil.createDataFormatModel(edgeData, this); if (dataType === 'edge') {
this._edgeDataModel.formatTooltip = function (dataIndex) { var nodeData = this.getData();
var params = this.getDataParams(dataIndex); var params = this.getDataParams(dataIndex, dataType);
var edge = graph.getEdgeByIndex(dataIndex); var edge = nodeData.graph.getEdgeByIndex(dataIndex);
var sourceName = data.getName(edge.node1.dataIndex); var sourceName = nodeData.getName(edge.node1.dataIndex);
var targetName = data.getName(edge.node2.dataIndex); var targetName = nodeData.getName(edge.node2.dataIndex);
var html = sourceName + ' > ' + targetName; var html = sourceName + ' > ' + targetName;
if (params.value) { if (params.value) {
html += ' : ' + params.value; html += ' : ' + params.value;
} }
return html; return html;
}; }
else { // dataType === 'node' or empty
return GraphSeries.superApply(this, 'formatTooltip', arguments);
}
}, },
_updateCategoriesData: function () { _updateCategoriesData: function () {
......
...@@ -61,13 +61,7 @@ define(function (require) { ...@@ -61,13 +61,7 @@ define(function (require) {
symbolDraw.updateData(data); symbolDraw.updateData(data);
var edgeData = seriesModel.getEdgeData(); var edgeData = seriesModel.getEdgeData();
lineDraw.updateData(edgeData); lineDraw.updateData(edgeData);
edgeData.eachItemGraphicEl(function (el) {
el.traverse(function (child) {
child.dataModel = seriesModel.getEdgeDataModel();
});
});
this._updateNodeAndLinkScale(); this._updateNodeAndLinkScale();
......
...@@ -286,7 +286,7 @@ define(function (require) { ...@@ -286,7 +286,7 @@ define(function (require) {
label.setStyle({ label.setStyle({
text: labelModel.get('show') text: labelModel.get('show')
? zrUtil.retrieve( ? zrUtil.retrieve(
seriesModel.getFormattedLabel(idx, 'normal', lineData), seriesModel.getFormattedLabel(idx, 'normal', lineData.dataType),
defaultText defaultText
) )
: '', : '',
...@@ -296,7 +296,7 @@ define(function (require) { ...@@ -296,7 +296,7 @@ define(function (require) {
label.hoverStyle = { label.hoverStyle = {
text: labelHoverModel.get('show') text: labelHoverModel.get('show')
? zrUtil.retrieve( ? zrUtil.retrieve(
seriesModel.getFormattedLabel(idx, 'emphasis', lineData), seriesModel.getFormattedLabel(idx, 'emphasis', lineData.dataType),
defaultText defaultText
) )
: '', : '',
......
...@@ -8,7 +8,7 @@ define(function (require) { ...@@ -8,7 +8,7 @@ define(function (require) {
var zrUtil = require('zrender/core/util'); var zrUtil = require('zrender/core/util');
var createListFromArray = require('./createListFromArray'); var createListFromArray = require('./createListFromArray');
return function (nodes, edges, hostModel, directed) { return function (nodes, edges, hostModel, directed, beforeLink) {
var graph = new Graph(directed); var graph = new Graph(directed);
for (var i = 0; i < nodes.length; i++) { for (var i = 0; i < nodes.length; i++) {
graph.addNode(zrUtil.retrieve( graph.addNode(zrUtil.retrieve(
...@@ -50,9 +50,16 @@ define(function (require) { ...@@ -50,9 +50,16 @@ define(function (require) {
var edgeData = new List(['value'], hostModel); var edgeData = new List(['value'], hostModel);
edgeData.initData(validEdges, linkNameList); edgeData.initData(validEdges, linkNameList);
graph.setEdgeData(edgeData); beforeLink && beforeLink(nodeData, edgeData);
linkList({
mainData: nodeData,
struct: graph,
structAttr: 'graph',
datas: {node: nodeData, edge: edgeData},
datasAttr: {node: 'data', edge: 'edgeData'}
});
linkList.linkToGraph(nodeData, graph);
// Update dataIndex of nodes and edges because invalid edge may be removed // Update dataIndex of nodes and edges because invalid edge may be removed
graph.update(); graph.update();
......
...@@ -76,9 +76,14 @@ define(function (require) { ...@@ -76,9 +76,14 @@ define(function (require) {
edgeData.initData(links); edgeData.initData(links);
graph.setEdgeData(edgeData); linkList({
mainData: nodeData,
struct: graph,
structAttr: 'graph',
datas: {node: nodeData, edge: edgeData},
datasAttr: {node: 'data', edge: 'edgeData'}
});
linkList.linkToGraph(nodeData, graph);
// Update dataIndex of nodes and edges because invalid edge may be removed // Update dataIndex of nodes and edges because invalid edge may be removed
graph.update(); graph.update();
......
...@@ -46,24 +46,6 @@ define(function(require) { ...@@ -46,24 +46,6 @@ define(function(require) {
}).join('<br />'); }).join('<br />');
}, },
getFormattedLabel: function (dataIndex, status, otherData, indicatorIndex) {
status = status || 'normal';
var data = otherData || this.getData();
var itemModel = data.getItemModel(dataIndex);
var params = this.getDataParams(dataIndex, otherData);
var formatter = itemModel.get(['label', status, 'formatter']);
// Get value of specified indicator
params.value = params.value[indicatorIndex || 0];
if (typeof formatter === 'function') {
params.status = status;
return formatter(params);
}
else if (typeof formatter === 'string') {
return formatUtil.formatTpl(formatter, params);
}
},
defaultOption: { defaultOption: {
zlevel: 0, zlevel: 0,
z: 2, z: 2,
......
...@@ -5,7 +5,7 @@ define(function (require) { ...@@ -5,7 +5,7 @@ define(function (require) {
var SeriesModel = require('../../model/Series'); var SeriesModel = require('../../model/Series');
var createGraphFromNodeEdge = require('../helper/createGraphFromNodeEdge'); var createGraphFromNodeEdge = require('../helper/createGraphFromNodeEdge');
return SeriesModel.extend({ var SankeySeries = SeriesModel.extend({
type: 'series.sankey', type: 'series.sankey',
...@@ -34,6 +34,22 @@ define(function (require) { ...@@ -34,6 +34,22 @@ define(function (require) {
return this.getGraph().edgeData; return this.getGraph().edgeData;
}, },
/**
* @override
*/
formatTooltip: function (dataIndex, multipleSeries, dataType) {
if (dataType === 'edge') {
var params = this.getDataParams(dataIndex, dataType);
var rawDataOpt = params.data;
var html = rawDataOpt.source + ' -- ' + rawDataOpt.target;
if (params.value) {
html += ' : ' + params.value;
}
return html;
}
// dataType === 'node' or empty do not show tooltip by default.
},
defaultOption: { defaultOption: {
zlevel: 0, zlevel: 0,
z: 2, z: 2,
...@@ -102,4 +118,5 @@ define(function (require) { ...@@ -102,4 +118,5 @@ define(function (require) {
}); });
return SankeySeries;
}); });
\ No newline at end of file
define(function (require) { define(function (require) {
var graphic = require('../../util/graphic'); var graphic = require('../../util/graphic');
var modelUtil = require('../../util/model');
var zrUtil = require('zrender/core/util'); var zrUtil = require('zrender/core/util');
var SankeyShape = graphic.extendShape({ var SankeyShape = graphic.extendShape({
...@@ -53,19 +52,6 @@ define(function (require) { ...@@ -53,19 +52,6 @@ define(function (require) {
group.position = [layoutInfo.x, layoutInfo.y]; group.position = [layoutInfo.x, layoutInfo.y];
var edgeData = graph.edgeData;
var formatModel = modelUtil.createDataFormatModel(edgeData, seriesModel);
formatModel.formatTooltip = function (dataIndex) {
var params = this.getDataParams(dataIndex);
var rawDataOpt = params.data;
var html = rawDataOpt.source + ' -- ' + rawDataOpt.target;
if (params.value) {
html += ':' + params.value;
}
return html;
};
// generate a rect for each node // generate a rect for each node
graph.eachNode(function (node) { graph.eachNode(function (node) {
var layout = node.getLayout(); var layout = node.getLayout();
...@@ -113,6 +99,10 @@ define(function (require) { ...@@ -113,6 +99,10 @@ define(function (require) {
} }
)); ));
rect.dataIndex = node.dataIndex;
rect.seriesIndex = seriesModel.seriesIndex;
rect.dataType = 'node';
group.add(rect); group.add(rect);
}); });
...@@ -121,7 +111,8 @@ define(function (require) { ...@@ -121,7 +111,8 @@ define(function (require) {
var curve = new SankeyShape(); var curve = new SankeyShape();
curve.dataIndex = edge.dataIndex; curve.dataIndex = edge.dataIndex;
curve.dataModel = formatModel; curve.seriesIndex = seriesModel.seriesIndex;
curve.dataType = 'edge';
var lineStyleModel = edge.getModel('lineStyle.normal'); var lineStyleModel = edge.getModel('lineStyle.normal');
var curvature = lineStyleModel.get('curveness'); var curvature = lineStyleModel.get('curveness');
......
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
define(function(require) { define(function(require) {
var TimelineModel = require('./TimelineModel'); var TimelineModel = require('./TimelineModel');
var zrUtil = require('zrender/core/util');
var modelUtil = require('../../util/model');
return TimelineModel.extend({ var SliderTimelineModel = TimelineModel.extend({
type: 'timeline.slider', type: 'timeline.slider',
...@@ -103,4 +105,7 @@ define(function(require) { ...@@ -103,4 +105,7 @@ define(function(require) {
}); });
zrUtil.mixin(SliderTimelineModel, modelUtil.dataFormatMixin);
return SliderTimelineModel;
}); });
\ No newline at end of file
...@@ -13,7 +13,6 @@ define(function (require) { ...@@ -13,7 +13,6 @@ define(function (require) {
var BoundingRect = require('zrender/core/BoundingRect'); var BoundingRect = require('zrender/core/BoundingRect');
var matrix = require('zrender/core/matrix'); var matrix = require('zrender/core/matrix');
var numberUtil = require('../../util/number'); var numberUtil = require('../../util/number');
var modelUtil = require('../../util/model');
var formatUtil = require('../../util/format'); var formatUtil = require('../../util/format');
var encodeHTML = formatUtil.encodeHTML; var encodeHTML = formatUtil.encodeHTML;
...@@ -85,6 +84,10 @@ define(function (require) { ...@@ -85,6 +84,10 @@ define(function (require) {
*/ */
var axis = this._axis = this._createAxis(layoutInfo, timelineModel); var axis = this._axis = this._createAxis(layoutInfo, timelineModel);
timelineModel.formatTooltip = function (dataIndex) {
return encodeHTML(axis.scale.getLabel(dataIndex));
};
each( each(
['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], ['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'],
function (name) { function (name) {
...@@ -351,7 +354,6 @@ define(function (require) { ...@@ -351,7 +354,6 @@ define(function (require) {
_renderAxisTick: function (layoutInfo, group, axis, timelineModel) { _renderAxisTick: function (layoutInfo, group, axis, timelineModel) {
var data = timelineModel.getData(); var data = timelineModel.getData();
var ticks = axis.scale.getTicks(); var ticks = axis.scale.getTicks();
var tooltipHostModel = this._prepareTooltipHostModel(data, timelineModel);
each(ticks, function (value, dataIndex) { each(ticks, function (value, dataIndex) {
...@@ -368,7 +370,7 @@ define(function (require) { ...@@ -368,7 +370,7 @@ define(function (require) {
if (itemModel.get('tooltip')) { if (itemModel.get('tooltip')) {
el.dataIndex = dataIndex; el.dataIndex = dataIndex;
el.dataModel = tooltipHostModel; el.dataModel = timelineModel;
} }
else { else {
el.dataIndex = el.dataModel = null; el.dataIndex = el.dataModel = null;
...@@ -377,22 +379,6 @@ define(function (require) { ...@@ -377,22 +379,6 @@ define(function (require) {
}, this); }, this);
}, },
/**
* @private
*/
_prepareTooltipHostModel: function (data, timelineModel) {
var tooltipHostModel = modelUtil.createDataFormatModel(
data, { mainType: 'timeline', subType: 'slider' }
);
var me = this;
tooltipHostModel.formatTooltip = function (dataIndex) {
return encodeHTML(me._axis.scale.getLabel(dataIndex));
};
return tooltipHostModel;
},
/** /**
* @private * @private
*/ */
......
...@@ -448,7 +448,7 @@ define(function (require) { ...@@ -448,7 +448,7 @@ define(function (require) {
// Reset last hover and dispatch downplay action // Reset last hover and dispatch downplay action
this._resetLastHover(); this._resetLastHover();
this._showItemTooltipContent(dataModel, dataIndex, e); this._showItemTooltipContent(dataModel, dataIndex, el.dataType, e);
} }
api.dispatchAction({ api.dispatchAction({
...@@ -496,7 +496,7 @@ define(function (require) { ...@@ -496,7 +496,7 @@ define(function (require) {
if (el && el.dataIndex != null) { if (el && el.dataIndex != null) {
var seriesModel = ecModel.getSeriesByIndex(el.seriesIndex); var seriesModel = ecModel.getSeriesByIndex(el.seriesIndex);
var dataIndex = el.dataIndex; var dataIndex = el.dataIndex;
this._showItemTooltipContent(seriesModel, dataIndex, e); this._showItemTooltipContent(seriesModel, dataIndex, el.dataType, e);
} }
} }
...@@ -999,9 +999,10 @@ define(function (require) { ...@@ -999,9 +999,10 @@ define(function (require) {
* Show tooltip on item * Show tooltip on item
* @param {module:echarts/model/Series} seriesModel * @param {module:echarts/model/Series} seriesModel
* @param {number} dataIndex * @param {number} dataIndex
* @param {string} dataType
* @param {Object} e * @param {Object} e
*/ */
_showItemTooltipContent: function (seriesModel, dataIndex, e) { _showItemTooltipContent: function (seriesModel, dataIndex, dataType, e) {
// FIXME Graph data // FIXME Graph data
var api = this._api; var api = this._api;
var data = seriesModel.getData(); var data = seriesModel.getData();
...@@ -1027,7 +1028,7 @@ define(function (require) { ...@@ -1027,7 +1028,7 @@ define(function (require) {
var params = seriesModel.getDataParams(dataIndex); var params = seriesModel.getDataParams(dataIndex);
var html; var html;
if (!formatter) { if (!formatter) {
html = seriesModel.formatTooltip(dataIndex); html = seriesModel.formatTooltip(dataIndex, false, dataType);
} }
else { else {
if (typeof formatter === 'string') { if (typeof formatter === 'string') {
......
...@@ -613,7 +613,7 @@ define(function(require) { ...@@ -613,7 +613,7 @@ define(function(require) {
} }
var dataModel = el.dataModel || this.ecModel.getSeriesByIndex(el.seriesIndex); var dataModel = el.dataModel || this.ecModel.getSeriesByIndex(el.seriesIndex);
var data = dataModel.getData(); var data = dataModel.getData(el.dataType);
var dim = data.getDimension(this.visualMapModel.getDataDimension(data)); var dim = data.getDimension(this.visualMapModel.getDataDimension(data));
var value = data.get(dim, el.dataIndex, true); var value = data.get(dim, el.dataIndex, true);
......
...@@ -303,10 +303,12 @@ define(function(require) { ...@@ -303,10 +303,12 @@ define(function(require) {
nodes[data.getRawIndex(i)].dataIndex = i; nodes[data.getRawIndex(i)].dataIndex = i;
} }
edgeData.silent = true;
edgeData.filterSelf(function (idx) { edgeData.filterSelf(function (idx) {
var edge = edges[edgeData.getRawIndex(idx)]; var edge = edges[edgeData.getRawIndex(idx)];
return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0; return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0;
}); });
edgeData.silent = false;
// Update edge // Update edge
for (var i = 0, len = edges.length; i < len; i++) { for (var i = 0, len = edges.length; i < len; i++) {
...@@ -317,19 +319,6 @@ define(function(require) { ...@@ -317,19 +319,6 @@ define(function(require) {
} }
}; };
/**
* Set edge data
* @param {module:echarts/data/List} edgeData
*/
graphProto.setEdgeData = function (edgeData) {
this.edgeData = edgeData;
this._edgeDataSaved = edgeData.cloneShallow();
};
graphProto.restoreData = function () {
this.edgeData = this._edgeDataSaved.cloneShallow();
};
/** /**
* @return {module:echarts/data/Graph} * @return {module:echarts/data/Graph}
*/ */
......
...@@ -93,6 +93,16 @@ define(function (require) { ...@@ -93,6 +93,16 @@ define(function (require) {
*/ */
this.hostModel = hostModel; this.hostModel = hostModel;
/**
* @type {module:echarts/model/Model}
*/
this.dataType;
/**
* @type {boolean}
*/
this.silent = false;
/** /**
* Indices stores the indices of data subset after filtered. * Indices stores the indices of data subset after filtered.
* This data subset will be used in chart. * This data subset will be used in chart.
...@@ -658,6 +668,8 @@ define(function (require) { ...@@ -658,6 +668,8 @@ define(function (require) {
// Reset data extent // Reset data extent
this._extent = {}; this._extent = {};
!this.silent && this.__onChange();
return this; return this;
}; };
...@@ -753,6 +765,8 @@ define(function (require) { ...@@ -753,6 +765,8 @@ define(function (require) {
} }
}, stack, context); }, stack, context);
!this.silent && this.__onTransfer(list);
return list; return list;
}; };
...@@ -798,6 +812,9 @@ define(function (require) { ...@@ -798,6 +812,9 @@ define(function (require) {
dimStore[idx] = value; dimStore[idx] = value;
indices.push(idx); indices.push(idx);
} }
!this.silent && this.__onTransfer(list);
return list; return list;
}; };
...@@ -955,6 +972,7 @@ define(function (require) { ...@@ -955,6 +972,7 @@ define(function (require) {
var setItemDataAndSeriesIndex = function (child) { var setItemDataAndSeriesIndex = function (child) {
child.seriesIndex = this.seriesIndex; child.seriesIndex = this.seriesIndex;
child.dataIndex = this.dataIndex; child.dataIndex = this.dataIndex;
child.dataType = this.dataType;
}; };
/** /**
* Set graphic element relative to data. It can be set as null * Set graphic element relative to data. It can be set as null
...@@ -968,6 +986,7 @@ define(function (require) { ...@@ -968,6 +986,7 @@ define(function (require) {
// Add data index and series index for indexing the data by element // Add data index and series index for indexing the data by element
// Useful in tooltip // Useful in tooltip
el.dataIndex = idx; el.dataIndex = idx;
el.dataType = this.dataType;
el.seriesIndex = hostModel && hostModel.seriesIndex; el.seriesIndex = hostModel && hostModel.seriesIndex;
if (el.type === 'group') { if (el.type === 'group') {
el.traverse(setItemDataAndSeriesIndex, el); el.traverse(setItemDataAndSeriesIndex, el);
...@@ -1012,6 +1031,8 @@ define(function (require) { ...@@ -1012,6 +1031,8 @@ define(function (require) {
list.indices = this.indices.slice(); list.indices = this.indices.slice();
!this.silent && this.__onTransfer(list);
return list; return list;
}; };
...@@ -1029,9 +1050,11 @@ define(function (require) { ...@@ -1029,9 +1050,11 @@ define(function (require) {
this.__wrappedMethods.push(methodName); this.__wrappedMethods.push(methodName);
this[methodName] = function () { this[methodName] = function () {
var res = originalMethod.apply(this, arguments); var res = originalMethod.apply(this, arguments);
return injectFunction.call(this, res); return injectFunction.apply(this, [res].concat(zrUtil.slice(arguments)));
}; };
}; };
listProto.__onTransfer = listProto.__onChange = zrUtil.noop;
return List; return List;
}); });
\ No newline at end of file
...@@ -8,7 +8,7 @@ define(function(require) { ...@@ -8,7 +8,7 @@ define(function(require) {
var zrUtil = require('zrender/core/util'); var zrUtil = require('zrender/core/util');
var Model = require('../model/Model'); var Model = require('../model/Model');
var List = require('./List'); var List = require('./List');
var linkListHelper = require('./helper/linkList'); var linkList = require('./helper/linkList');
var completeDimensions = require('./helper/completeDimensions'); var completeDimensions = require('./helper/completeDimensions');
/** /**
...@@ -433,7 +433,11 @@ define(function(require) { ...@@ -433,7 +433,11 @@ define(function(require) {
var list = new List(dimensions, hostModel); var list = new List(dimensions, hostModel);
list.initData(listData); list.initData(listData);
linkListHelper.linkToTree(list, tree); linkList({
mainData: list,
struct: tree,
structAttr: 'tree'
});
return tree; return tree;
}; };
......
/** /**
* Link list to graph or tree * Link lists and struct (graph or tree)
*/ */
define(function (require) { define(function (require) {
var zrUtil = require('zrender/core/util'); var zrUtil = require('zrender/core/util');
var arraySlice = Array.prototype.slice; var each = zrUtil.each;
var DATAS = '\0__link_datas';
var MAIN_DATA = '\0__link_mainData';
// Caution: // Caution:
// In most case, only one of the list and its shallow clones (see list.cloneShallow) // In most case, either list or its shallow clones (see list.cloneShallow)
// can be active in echarts process. Considering heap memory consumption, // is active in echarts process. So considering heap memory consumption,
// we do not clone tree or graph, but share them among list and its shallow clones. // we do not clone tree or graph, but share them among list and its shallow clones.
// But in some rare case, we have to keep old list (like do animation in chart). So // But in some rare case, we have to keep old list (like do animation in chart). So
// please take care that both the old list and the new list share the same tree/graph. // please take care that both the old list and the new list share the same tree/graph.
function linkList(list, target, targetType) { /**
zrUtil.each(listProxyMethods, function (method, methodName) { * @param {Object} opt
var originMethod = list[methodName]; * @param {module:echarts/data/List} opt.mainData
list[methodName] = zrUtil.curry(method, originMethod, target, targetType); * @param {Object} [opt.struct] For example, instance of Graph or Tree.
}); * @param {string} [opt.structAttr] designation: list[structAttr] = struct;
* @param {Object} [opt.datas] {dataType: data},
* like: {node: nodeList, edge: edgeList}.
* Should contain mainData.
* @param {Object} [opt.datasAttr] {dataType: attr},
* designation: struct[datasAttr[dataType]] = list;
*/
function linkList(opt) {
var mainData = opt.mainData;
var datas = opt.datas;
if (!datas) {
datas = {main: mainData};
opt.datasAttr = {main: 'data'};
}
opt.datas = opt.mainData = null;
linkAll(mainData, datas, opt);
list[targetType] = target; // Porxy data original methods.
target.data = list; each(datas, function (data) {
each(injections, function (injection, methodName) {
data.wrapMethod(methodName, zrUtil.curry(injection, opt));
});
});
return list; // Make sure datas contains mainData.
zrUtil.assert(datas[mainData.dataType] === mainData);
} }
var listProxyMethods = { var injections = {
cloneShallow: function (originMethod, target, targetType) {
var newList = originMethod.apply(this, arraySlice.call(arguments, 3)); __onTransfer: function (opt, res, newData) {
return linkList(newList, target, targetType); if (isMainData(this)) {
// Transfer datas to new main data.
var datas = zrUtil.extend({}, this[DATAS]);
datas[this.dataType] = newData;
linkAll(newData, datas, opt);
}
else {
// Modify the reference in main data to point newData.
linkSingle(newData, this.dataType, this[MAIN_DATA], opt);
}
}, },
map: function (originMethod, target, targetType) {
var newList = originMethod.apply(this, arraySlice.call(arguments, 3)); __onChange: function (opt) {
return linkList(newList, target, targetType); opt.struct && opt.struct.update(this);
}, },
filterSelf: function (originMethod, target, targetType) {
var result = originMethod.apply(this, arraySlice.call(arguments, 3)); cloneShallow: function (opt, newData) {
target.update(); // cloneShallow, which brings about some fragilities, may be inappropriate
return result; // to be exposed as an API. So for implementation simplicity we can make
// the restriction that cloneShallow of not-mainData should not be invoked
// outside, but only be invoked here.
isMainData(this) && each(newData[DATAS], function (data, dataType) {
data !== newData && linkSingle(data.cloneShallow(), dataType, newData, opt);
});
return newData;
} }
}; };
return { /**
linkToGraph: function (list, graph) { * Supplement method to List.
linkList(list, graph, 'graph'); *
}, * @public
* @param {string} [dataType] If not specified, return mainData.
* @return {module:echarts/data/List}
*/
function getLinkedData(dataType) {
var mainData = this[MAIN_DATA];
return (dataType == null || mainData == null)
? mainData
: mainData[DATAS][dataType];
}
linkToTree: function (list, tree) { function isMainData(data) {
linkList(list, tree, 'tree'); return data[MAIN_DATA] === data;
}
function linkAll(mainData, datas, opt) {
mainData[DATAS] = {};
each(datas, function (data, dataType) {
linkSingle(data, dataType, mainData, opt);
});
}
function linkSingle(data, dataType, mainData, opt) {
mainData[DATAS][dataType] = data;
data[MAIN_DATA] = mainData;
data.dataType = dataType;
if (opt.struct) {
data[opt.structAttr] = opt.struct;
opt.struct[opt.datasAttr[dataType]] = data;
} }
};
// Supplement method.
data.getLinkedData = getLinkedData;
}
return linkList;
}); });
\ No newline at end of file
...@@ -845,7 +845,7 @@ define(function (require) { ...@@ -845,7 +845,7 @@ define(function (require) {
var el = e.target; var el = e.target;
if (el && el.dataIndex != null) { if (el && el.dataIndex != null) {
var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex); var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex);
var params = dataModel && dataModel.getDataParams(el.dataIndex) || {}; var params = dataModel && dataModel.getDataParams(el.dataIndex, el.dataType) || {};
params.event = e; params.event = e;
params.type = eveName; params.type = eveName;
this.trigger(eveName, params); this.trigger(eveName, params);
......
...@@ -51,9 +51,11 @@ define(function(require) { ...@@ -51,9 +51,11 @@ define(function(require) {
*/ */
this._dataBeforeProcessed = this.getInitialData(option, ecModel); this._dataBeforeProcessed = this.getInitialData(option, ecModel);
// When using module:echarts/data/Tree or module:echarts/data/Graph, // If we reverse the order (make this._data firstly, and then make
// cloneShallow will cause this._data.graph.data pointing to new data list. // this._dataBeforeProcessed by cloneShallow), cloneShallow will
// Wo we make this._dataBeforeProcessed first, and then make this._data. // cause this._data.graph.data !== this._data when using
// module:echarts/data/Graph or module:echarts/data/Tree.
// See module:echarts/data/helper/linkList
this._data = this._dataBeforeProcessed.cloneShallow(); this._data = this._dataBeforeProcessed.cloneShallow();
}, },
...@@ -108,10 +110,11 @@ define(function(require) { ...@@ -108,10 +110,11 @@ define(function(require) {
getInitialData: function () {}, getInitialData: function () {},
/** /**
* @param {string} [dataType]
* @return {module:echarts/data/List} * @return {module:echarts/data/List}
*/ */
getData: function () { getData: function (dataType) {
return this._data; return dataType == null ? this._data : this._data.getLinkedData(dataType);
}, },
/** /**
...@@ -172,8 +175,9 @@ define(function(require) { ...@@ -172,8 +175,9 @@ define(function(require) {
* *
* @param {number} dataIndex * @param {number} dataIndex
* @param {boolean} [multipleSeries=false] * @param {boolean} [multipleSeries=false]
* @param {number} [dataType]
*/ */
formatTooltip: function (dataIndex, multipleSeries) { formatTooltip: function (dataIndex, multipleSeries, dataType) {
var data = this._data; var data = this._data;
var value = this.getRawValue(dataIndex); var value = this.getRawValue(dataIndex);
var formattedValue = zrUtil.isArray(value) var formattedValue = zrUtil.isArray(value)
...@@ -194,7 +198,9 @@ define(function(require) { ...@@ -194,7 +198,9 @@ define(function(require) {
restoreData: function () { restoreData: function () {
this._data = this._dataBeforeProcessed.cloneShallow(); this._data = this._dataBeforeProcessed.cloneShallow();
} },
getAxisTooltipDataIndex: null
}); });
zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin); zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin);
......
...@@ -4,8 +4,6 @@ define(function(require) { ...@@ -4,8 +4,6 @@ define(function(require) {
var nubmerUtil = require('./number'); var nubmerUtil = require('./number');
var zrUtil = require('zrender/core/util'); var zrUtil = require('zrender/core/util');
var Model = require('../model/Model');
var AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle']; var AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle'];
var modelUtil = {}; var modelUtil = {};
...@@ -178,29 +176,6 @@ define(function(require) { ...@@ -178,29 +176,6 @@ define(function(require) {
modelUtil.LABEL_OPTIONS = ['position', 'show', 'textStyle', 'distance', 'formatter']; modelUtil.LABEL_OPTIONS = ['position', 'show', 'textStyle', 'distance', 'formatter'];
/**
* Create a model proxy to be used in tooltip for edge data, markLine data, markPoint data.
* @param {module:echarts/data/List} data
* @param {Object} opt
* @param {string} [opt.seriesIndex]
* @param {Object} [opt.name]
* @param {Object} [opt.mainType]
* @param {Object} [opt.subType]
*/
modelUtil.createDataFormatModel = function (data, opt) {
var model = new Model();
zrUtil.mixin(model, modelUtil.dataFormatMixin);
model.seriesIndex = opt.seriesIndex;
model.name = opt.name || '';
model.mainType = opt.mainType;
model.subType = opt.subType;
model.getData = function () {
return data;
};
return model;
};
/** /**
* data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]
* This helper method retieves value from data. * This helper method retieves value from data.
...@@ -239,16 +214,16 @@ define(function(require) { ...@@ -239,16 +214,16 @@ define(function(require) {
/** /**
* Get params for formatter * Get params for formatter
* @param {number} dataIndex * @param {number} dataIndex
* @param {module:echarts/data/List} [otherData] * @param {string} [dataType]
* @return {Object} * @return {Object}
*/ */
getDataParams: function (dataIndex, otherData) { getDataParams: function (dataIndex, dataType) {
var data = otherData || this.getData(); var data = this.getData(dataType);
var seriesIndex = this.seriesIndex; var seriesIndex = this.seriesIndex;
var seriesName = this.name; var seriesName = this.name;
var rawValue = this.getRawValue(dataIndex); var rawValue = this.getRawValue(dataIndex, dataType);
var rawDataIndex = data.getRawIndex(dataIndex); var rawDataIndex = data.getRawIndex(dataIndex);
var name = data.getName(dataIndex, true); var name = data.getName(dataIndex, true);
var itemOpt = data.getRawDataItem(dataIndex); var itemOpt = data.getRawDataItem(dataIndex);
...@@ -262,6 +237,7 @@ define(function(require) { ...@@ -262,6 +237,7 @@ define(function(require) {
name: name, name: name,
dataIndex: rawDataIndex, dataIndex: rawDataIndex,
data: itemOpt, data: itemOpt,
dataType: dataType,
value: rawValue, value: rawValue,
color: data.getItemVisual(dataIndex, 'color'), color: data.getItemVisual(dataIndex, 'color'),
...@@ -274,15 +250,20 @@ define(function(require) { ...@@ -274,15 +250,20 @@ define(function(require) {
* Format label * Format label
* @param {number} dataIndex * @param {number} dataIndex
* @param {string} [status='normal'] 'normal' or 'emphasis' * @param {string} [status='normal'] 'normal' or 'emphasis'
* @param {module:echarts/data/List} [otherData] * @param {string} [dataType]
* @param {number} [dimIndex]
* @return {string} * @return {string}
*/ */
getFormattedLabel: function (dataIndex, status, otherData) { getFormattedLabel: function (dataIndex, status, dataType, dimIndex) {
status = status || 'normal'; status = status || 'normal';
var data = otherData || this.getData(); var data = this.getData(dataType);
var itemModel = data.getItemModel(dataIndex); var itemModel = data.getItemModel(dataIndex);
var params = this.getDataParams(dataIndex, otherData); var params = this.getDataParams(dataIndex, dataType);
if (dimIndex != null && zrUtil.isArray(params.value)) {
params.value = params.value[dimIndex];
}
var formatter = itemModel.get(['label', status, 'formatter']); var formatter = itemModel.get(['label', status, 'formatter']);
if (typeof formatter === 'function') { if (typeof formatter === 'function') {
...@@ -297,17 +278,26 @@ define(function(require) { ...@@ -297,17 +278,26 @@ define(function(require) {
/** /**
* Get raw value in option * Get raw value in option
* @param {number} idx * @param {number} idx
* @param {module:echarts/data/List} [otherData] * @param {string} [dataType]
* @return {Object} * @return {Object}
*/ */
getRawValue: function (idx, otherData) { getRawValue: function (idx, dataType) {
var data = otherData || this.getData(); var data = this.getData(dataType);
var dataItem = data.getRawDataItem(idx); var dataItem = data.getRawDataItem(idx);
if (dataItem != null) { if (dataItem != null) {
return (zrUtil.isObject(dataItem) && !zrUtil.isArray(dataItem)) return (zrUtil.isObject(dataItem) && !zrUtil.isArray(dataItem))
? dataItem.value : dataItem; ? dataItem.value : dataItem;
} }
} },
/**
* Should be implemented.
* @param {number} dataIndex
* @param {boolean} [multipleSeries=false]
* @param {number} [dataType]
* @return {string} tooltip string
*/
formatTooltip: zrUtil.noop
}; };
/** /**
......
...@@ -198,6 +198,10 @@ ...@@ -198,6 +198,10 @@
} }
] ]
}); });
chart.on('click', function (params) {
console.log(params);
});
} }
</script> </script>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册