in src/core/echarts.ts [1888:1999]
doDispatchAction = function (this: ECharts, payload: Payload, silent: boolean): void {
const ecModel = this.getModel();
const payloadType = payload.type;
const escapeConnect = payload.escapeConnect;
const actionWrap = actions[payloadType];
const actionInfo = actionWrap.actionInfo;
const cptTypeTmp = (actionInfo.update || 'update').split(':');
const updateMethod = cptTypeTmp.pop();
const cptType = cptTypeTmp[0] != null && parseClassType(cptTypeTmp[0]);
this[IN_MAIN_PROCESS_KEY] = true;
let payloads: Payload[] = [payload];
let batched = false;
// Batch action
if (payload.batch) {
batched = true;
payloads = map<Payload['batch'][0], Payload, unknown>(payload.batch, function (item) {
item = defaults(extend({}, item), payload);
item.batch = null;
return item as Payload;
});
}
const eventObjBatch: ECEventData[] = [];
let eventObj: ECActionEvent;
const isSelectChange = isSelectChangePayload(payload);
const isHighDown = isHighDownPayload(payload);
// Only leave blur once if there are multiple batches.
if (isHighDown) {
allLeaveBlur(this._api);
}
each(payloads, (batchItem) => {
// Action can specify the event by return it.
eventObj = actionWrap.action(batchItem, this._model, this._api) as ECActionEvent;
// Emit event outside
eventObj = eventObj || extend({} as ECActionEvent, batchItem);
// Convert type to eventType
eventObj.type = actionInfo.event || eventObj.type;
eventObjBatch.push(eventObj);
// light update does not perform data process, layout and visual.
if (isHighDown) {
const { queryOptionMap, mainTypeSpecified } = modelUtil.preParseFinder(payload as ModelFinder);
const componentMainType = mainTypeSpecified ? queryOptionMap.keys()[0] : 'series';
updateDirectly(this, updateMethod, batchItem as Payload, componentMainType);
markStatusToUpdate(this);
}
else if (isSelectChange) {
// At present `dispatchAction({ type: 'select', ... })` is not supported on components.
// geo still use 'geoselect'.
updateDirectly(this, updateMethod, batchItem as Payload, 'series');
markStatusToUpdate(this);
}
else if (cptType) {
updateDirectly(this, updateMethod, batchItem as Payload, cptType.main, cptType.sub);
}
});
if (updateMethod !== 'none' && !isHighDown && !isSelectChange && !cptType) {
try {
// Still dirty
if (this[PENDING_UPDATE]) {
prepare(this);
updateMethods.update.call(this, payload);
this[PENDING_UPDATE] = null;
}
else {
updateMethods[updateMethod as keyof typeof updateMethods].call(this, payload);
}
}
catch (e) {
this[IN_MAIN_PROCESS_KEY] = false;
throw e;
}
}
// Follow the rule of action batch
if (batched) {
eventObj = {
type: actionInfo.event || payloadType,
escapeConnect: escapeConnect,
batch: eventObjBatch
};
}
else {
eventObj = eventObjBatch[0] as ECActionEvent;
}
this[IN_MAIN_PROCESS_KEY] = false;
if (!silent) {
const messageCenter = this._messageCenter;
messageCenter.trigger(eventObj.type, eventObj);
// Extra triggered 'selectchanged' event
if (isSelectChange) {
const newObj: SelectChangedPayload = {
type: 'selectchanged',
escapeConnect: escapeConnect,
selected: getAllSelectedIndices(ecModel),
isFromClick: payload.isFromClick || false,
fromAction: payload.type as 'select' | 'unselect' | 'toggleSelected',
fromActionPayload: payload
};
messageCenter.trigger(newObj.type, newObj);
}
}
};