提交 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) {
this.fillDataTextStyle(option.edges || option.links);
this._updateCategoriesData();
this._updateEdgeDataModel();
},
mergeOption: function (option) {
......@@ -33,7 +32,6 @@ define(function (require) {
this.fillDataTextStyle(option.edges || option.links);
this._updateCategoriesData();
this._updateEdgeDataModel();
},
mergeDefaultAndTheme: function (option) {
......@@ -44,12 +42,13 @@ define(function (require) {
getInitialData: function (option, ecModel) {
var edges = option.edges || option.links || [];
var nodes = option.data || option.nodes || [];
var self = this;
if (nodes && edges) {
var graph = createGraphFromNodeEdge(nodes, edges, this, true);
var nodeData = graph.data;
var edgeData = graph.edgeData;
var self = this;
return createGraphFromNodeEdge(nodes, edges, this, true, beforeLink).data;
}
function beforeLink(nodeData, edgeData) {
// Overwrite nodeData.getItemModel to
nodeData.wrapMethod('getItemModel', function (model) {
var categoriesModels = self._categoriesModels;
......@@ -62,7 +61,7 @@ define(function (require) {
return model;
});
var edgeLabelModel = this.getModel('edgeLabel');
var edgeLabelModel = self.getModel('edgeLabel');
var wrappedGetEdgeModel = function (path, parentModel) {
var pathArr = (path || '').split('.');
if (pathArr[0] === 'label') {
......@@ -78,20 +77,9 @@ define(function (require) {
model.getModel = wrappedGetEdgeModel;
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}
*/
......@@ -106,10 +94,6 @@ define(function (require) {
return this.getGraph().edgeData;
},
getEdgeDataModel: function () {
return this._edgeDataModel;
},
/**
* @return {module:echarts/data/List}
*/
......@@ -117,23 +101,25 @@ define(function (require) {
return this._categoriesData;
},
_updateEdgeDataModel: function () {
var graph = this.getGraph();
var edgeData = this.getEdgeData();
var data = this.getData();
this._edgeDataModel = modelUtil.createDataFormatModel(edgeData, this);
this._edgeDataModel.formatTooltip = function (dataIndex) {
var params = this.getDataParams(dataIndex);
var edge = graph.getEdgeByIndex(dataIndex);
var sourceName = data.getName(edge.node1.dataIndex);
var targetName = data.getName(edge.node2.dataIndex);
/**
* @override
*/
formatTooltip: function (dataIndex, multipleSeries, dataType) {
if (dataType === 'edge') {
var nodeData = this.getData();
var params = this.getDataParams(dataIndex, dataType);
var edge = nodeData.graph.getEdgeByIndex(dataIndex);
var sourceName = nodeData.getName(edge.node1.dataIndex);
var targetName = nodeData.getName(edge.node2.dataIndex);
var html = sourceName + ' > ' + targetName;
if (params.value) {
html += ' : ' + params.value;
}
return html;
};
}
else { // dataType === 'node' or empty
return GraphSeries.superApply(this, 'formatTooltip', arguments);
}
},
_updateCategoriesData: function () {
......
......@@ -61,13 +61,7 @@ define(function (require) {
symbolDraw.updateData(data);
var edgeData = seriesModel.getEdgeData();
lineDraw.updateData(edgeData);
edgeData.eachItemGraphicEl(function (el) {
el.traverse(function (child) {
child.dataModel = seriesModel.getEdgeDataModel();
});
});
this._updateNodeAndLinkScale();
......
......@@ -286,7 +286,7 @@ define(function (require) {
label.setStyle({
text: labelModel.get('show')
? zrUtil.retrieve(
seriesModel.getFormattedLabel(idx, 'normal', lineData),
seriesModel.getFormattedLabel(idx, 'normal', lineData.dataType),
defaultText
)
: '',
......@@ -296,7 +296,7 @@ define(function (require) {
label.hoverStyle = {
text: labelHoverModel.get('show')
? zrUtil.retrieve(
seriesModel.getFormattedLabel(idx, 'emphasis', lineData),
seriesModel.getFormattedLabel(idx, 'emphasis', lineData.dataType),
defaultText
)
: '',
......
......@@ -8,7 +8,7 @@ define(function (require) {
var zrUtil = require('zrender/core/util');
var createListFromArray = require('./createListFromArray');
return function (nodes, edges, hostModel, directed) {
return function (nodes, edges, hostModel, directed, beforeLink) {
var graph = new Graph(directed);
for (var i = 0; i < nodes.length; i++) {
graph.addNode(zrUtil.retrieve(
......@@ -50,9 +50,16 @@ define(function (require) {
var edgeData = new List(['value'], hostModel);
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
graph.update();
......
......@@ -76,9 +76,14 @@ define(function (require) {
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
graph.update();
......
......@@ -46,24 +46,6 @@ define(function(require) {
}).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: {
zlevel: 0,
z: 2,
......
......@@ -5,7 +5,7 @@ define(function (require) {
var SeriesModel = require('../../model/Series');
var createGraphFromNodeEdge = require('../helper/createGraphFromNodeEdge');
return SeriesModel.extend({
var SankeySeries = SeriesModel.extend({
type: 'series.sankey',
......@@ -34,6 +34,22 @@ define(function (require) {
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: {
zlevel: 0,
z: 2,
......@@ -102,4 +118,5 @@ define(function (require) {
});
return SankeySeries;
});
\ No newline at end of file
define(function (require) {
var graphic = require('../../util/graphic');
var modelUtil = require('../../util/model');
var zrUtil = require('zrender/core/util');
var SankeyShape = graphic.extendShape({
......@@ -53,19 +52,6 @@ define(function (require) {
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
graph.eachNode(function (node) {
var layout = node.getLayout();
......@@ -113,6 +99,10 @@ define(function (require) {
}
));
rect.dataIndex = node.dataIndex;
rect.seriesIndex = seriesModel.seriesIndex;
rect.dataType = 'node';
group.add(rect);
});
......@@ -121,7 +111,8 @@ define(function (require) {
var curve = new SankeyShape();
curve.dataIndex = edge.dataIndex;
curve.dataModel = formatModel;
curve.seriesIndex = seriesModel.seriesIndex;
curve.dataType = 'edge';
var lineStyleModel = edge.getModel('lineStyle.normal');
var curvature = lineStyleModel.get('curveness');
......
......@@ -4,8 +4,10 @@
define(function(require) {
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',
......@@ -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) {
var BoundingRect = require('zrender/core/BoundingRect');
var matrix = require('zrender/core/matrix');
var numberUtil = require('../../util/number');
var modelUtil = require('../../util/model');
var formatUtil = require('../../util/format');
var encodeHTML = formatUtil.encodeHTML;
......@@ -85,6 +84,10 @@ define(function (require) {
*/
var axis = this._axis = this._createAxis(layoutInfo, timelineModel);
timelineModel.formatTooltip = function (dataIndex) {
return encodeHTML(axis.scale.getLabel(dataIndex));
};
each(
['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'],
function (name) {
......@@ -351,7 +354,6 @@ define(function (require) {
_renderAxisTick: function (layoutInfo, group, axis, timelineModel) {
var data = timelineModel.getData();
var ticks = axis.scale.getTicks();
var tooltipHostModel = this._prepareTooltipHostModel(data, timelineModel);
each(ticks, function (value, dataIndex) {
......@@ -368,7 +370,7 @@ define(function (require) {
if (itemModel.get('tooltip')) {
el.dataIndex = dataIndex;
el.dataModel = tooltipHostModel;
el.dataModel = timelineModel;
}
else {
el.dataIndex = el.dataModel = null;
......@@ -377,22 +379,6 @@ define(function (require) {
}, 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
*/
......
......@@ -448,7 +448,7 @@ define(function (require) {
// Reset last hover and dispatch downplay action
this._resetLastHover();
this._showItemTooltipContent(dataModel, dataIndex, e);
this._showItemTooltipContent(dataModel, dataIndex, el.dataType, e);
}
api.dispatchAction({
......@@ -496,7 +496,7 @@ define(function (require) {
if (el && el.dataIndex != null) {
var seriesModel = ecModel.getSeriesByIndex(el.seriesIndex);
var dataIndex = el.dataIndex;
this._showItemTooltipContent(seriesModel, dataIndex, e);
this._showItemTooltipContent(seriesModel, dataIndex, el.dataType, e);
}
}
......@@ -999,9 +999,10 @@ define(function (require) {
* Show tooltip on item
* @param {module:echarts/model/Series} seriesModel
* @param {number} dataIndex
* @param {string} dataType
* @param {Object} e
*/
_showItemTooltipContent: function (seriesModel, dataIndex, e) {
_showItemTooltipContent: function (seriesModel, dataIndex, dataType, e) {
// FIXME Graph data
var api = this._api;
var data = seriesModel.getData();
......@@ -1027,7 +1028,7 @@ define(function (require) {
var params = seriesModel.getDataParams(dataIndex);
var html;
if (!formatter) {
html = seriesModel.formatTooltip(dataIndex);
html = seriesModel.formatTooltip(dataIndex, false, dataType);
}
else {
if (typeof formatter === 'string') {
......
......@@ -613,7 +613,7 @@ define(function(require) {
}
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 value = data.get(dim, el.dataIndex, true);
......
......@@ -303,10 +303,12 @@ define(function(require) {
nodes[data.getRawIndex(i)].dataIndex = i;
}
edgeData.silent = true;
edgeData.filterSelf(function (idx) {
var edge = edges[edgeData.getRawIndex(idx)];
return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0;
});
edgeData.silent = false;
// Update edge
for (var i = 0, len = edges.length; i < len; i++) {
......@@ -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}
*/
......
......@@ -93,6 +93,16 @@ define(function (require) {
*/
this.hostModel = hostModel;
/**
* @type {module:echarts/model/Model}
*/
this.dataType;
/**
* @type {boolean}
*/
this.silent = false;
/**
* Indices stores the indices of data subset after filtered.
* This data subset will be used in chart.
......@@ -658,6 +668,8 @@ define(function (require) {
// Reset data extent
this._extent = {};
!this.silent && this.__onChange();
return this;
};
......@@ -753,6 +765,8 @@ define(function (require) {
}
}, stack, context);
!this.silent && this.__onTransfer(list);
return list;
};
......@@ -798,6 +812,9 @@ define(function (require) {
dimStore[idx] = value;
indices.push(idx);
}
!this.silent && this.__onTransfer(list);
return list;
};
......@@ -955,6 +972,7 @@ define(function (require) {
var setItemDataAndSeriesIndex = function (child) {
child.seriesIndex = this.seriesIndex;
child.dataIndex = this.dataIndex;
child.dataType = this.dataType;
};
/**
* Set graphic element relative to data. It can be set as null
......@@ -968,6 +986,7 @@ define(function (require) {
// Add data index and series index for indexing the data by element
// Useful in tooltip
el.dataIndex = idx;
el.dataType = this.dataType;
el.seriesIndex = hostModel && hostModel.seriesIndex;
if (el.type === 'group') {
el.traverse(setItemDataAndSeriesIndex, el);
......@@ -1012,6 +1031,8 @@ define(function (require) {
list.indices = this.indices.slice();
!this.silent && this.__onTransfer(list);
return list;
};
......@@ -1029,9 +1050,11 @@ define(function (require) {
this.__wrappedMethods.push(methodName);
this[methodName] = function () {
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;
});
\ No newline at end of file
......@@ -8,7 +8,7 @@ define(function(require) {
var zrUtil = require('zrender/core/util');
var Model = require('../model/Model');
var List = require('./List');
var linkListHelper = require('./helper/linkList');
var linkList = require('./helper/linkList');
var completeDimensions = require('./helper/completeDimensions');
/**
......@@ -433,7 +433,11 @@ define(function(require) {
var list = new List(dimensions, hostModel);
list.initData(listData);
linkListHelper.linkToTree(list, tree);
linkList({
mainData: list,
struct: tree,
structAttr: 'tree'
});
return tree;
};
......
/**
* Link list to graph or tree
* Link lists and struct (graph or tree)
*/
define(function (require) {
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:
// In most case, only one of the list and its shallow clones (see list.cloneShallow)
// can be active in echarts process. Considering heap memory consumption,
// In most case, either list or its shallow clones (see list.cloneShallow)
// 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.
// 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.
function linkList(list, target, targetType) {
zrUtil.each(listProxyMethods, function (method, methodName) {
var originMethod = list[methodName];
list[methodName] = zrUtil.curry(method, originMethod, target, targetType);
});
/**
* @param {Object} opt
* @param {module:echarts/data/List} opt.mainData
* @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;
target.data = list;
// Porxy data original methods.
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 = {
cloneShallow: function (originMethod, target, targetType) {
var newList = originMethod.apply(this, arraySlice.call(arguments, 3));
return linkList(newList, target, targetType);
var injections = {
__onTransfer: function (opt, res, newData) {
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));
return linkList(newList, target, targetType);
__onChange: function (opt) {
opt.struct && opt.struct.update(this);
},
filterSelf: function (originMethod, target, targetType) {
var result = originMethod.apply(this, arraySlice.call(arguments, 3));
target.update();
return result;
cloneShallow: function (opt, newData) {
// cloneShallow, which brings about some fragilities, may be inappropriate
// 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) {
linkList(list, graph, 'graph');
},
/**
* Supplement method to List.
*
* @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) {
linkList(list, tree, 'tree');
function isMainData(data) {
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) {
var el = e.target;
if (el && el.dataIndex != null) {
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.type = eveName;
this.trigger(eveName, params);
......
......@@ -51,9 +51,11 @@ define(function(require) {
*/
this._dataBeforeProcessed = this.getInitialData(option, ecModel);
// When using module:echarts/data/Tree or module:echarts/data/Graph,
// cloneShallow will cause this._data.graph.data pointing to new data list.
// Wo we make this._dataBeforeProcessed first, and then make this._data.
// If we reverse the order (make this._data firstly, and then make
// this._dataBeforeProcessed by cloneShallow), cloneShallow will
// 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();
},
......@@ -108,10 +110,11 @@ define(function(require) {
getInitialData: function () {},
/**
* @param {string} [dataType]
* @return {module:echarts/data/List}
*/
getData: function () {
return this._data;
getData: function (dataType) {
return dataType == null ? this._data : this._data.getLinkedData(dataType);
},
/**
......@@ -172,8 +175,9 @@ define(function(require) {
*
* @param {number} dataIndex
* @param {boolean} [multipleSeries=false]
* @param {number} [dataType]
*/
formatTooltip: function (dataIndex, multipleSeries) {
formatTooltip: function (dataIndex, multipleSeries, dataType) {
var data = this._data;
var value = this.getRawValue(dataIndex);
var formattedValue = zrUtil.isArray(value)
......@@ -194,7 +198,9 @@ define(function(require) {
restoreData: function () {
this._data = this._dataBeforeProcessed.cloneShallow();
}
},
getAxisTooltipDataIndex: null
});
zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin);
......
......@@ -4,8 +4,6 @@ define(function(require) {
var nubmerUtil = require('./number');
var zrUtil = require('zrender/core/util');
var Model = require('../model/Model');
var AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle'];
var modelUtil = {};
......@@ -178,29 +176,6 @@ define(function(require) {
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]}]
* This helper method retieves value from data.
......@@ -239,16 +214,16 @@ define(function(require) {
/**
* Get params for formatter
* @param {number} dataIndex
* @param {module:echarts/data/List} [otherData]
* @param {string} [dataType]
* @return {Object}
*/
getDataParams: function (dataIndex, otherData) {
var data = otherData || this.getData();
getDataParams: function (dataIndex, dataType) {
var data = this.getData(dataType);
var seriesIndex = this.seriesIndex;
var seriesName = this.name;
var rawValue = this.getRawValue(dataIndex);
var rawValue = this.getRawValue(dataIndex, dataType);
var rawDataIndex = data.getRawIndex(dataIndex);
var name = data.getName(dataIndex, true);
var itemOpt = data.getRawDataItem(dataIndex);
......@@ -262,6 +237,7 @@ define(function(require) {
name: name,
dataIndex: rawDataIndex,
data: itemOpt,
dataType: dataType,
value: rawValue,
color: data.getItemVisual(dataIndex, 'color'),
......@@ -274,15 +250,20 @@ define(function(require) {
* Format label
* @param {number} dataIndex
* @param {string} [status='normal'] 'normal' or 'emphasis'
* @param {module:echarts/data/List} [otherData]
* @param {string} [dataType]
* @param {number} [dimIndex]
* @return {string}
*/
getFormattedLabel: function (dataIndex, status, otherData) {
getFormattedLabel: function (dataIndex, status, dataType, dimIndex) {
status = status || 'normal';
var data = otherData || this.getData();
var data = this.getData(dataType);
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']);
if (typeof formatter === 'function') {
......@@ -297,17 +278,26 @@ define(function(require) {
/**
* Get raw value in option
* @param {number} idx
* @param {module:echarts/data/List} [otherData]
* @param {string} [dataType]
* @return {Object}
*/
getRawValue: function (idx, otherData) {
var data = otherData || this.getData();
getRawValue: function (idx, dataType) {
var data = this.getData(dataType);
var dataItem = data.getRawDataItem(idx);
if (dataItem != null) {
return (zrUtil.isObject(dataItem) && !zrUtil.isArray(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 @@
}
]
});
chart.on('click', function (params) {
console.log(params);
});
}
</script>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册