UNPKG

12.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"scale-pool.js","sourceRoot":"","sources":["../../../src/chart/util/scale-pool.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * view 中缓存 scale 的类\n */\nimport { deepMix, each, get, isNumber, last } from '@antv/util';\nimport { Scale, Coordinate } from '../../dependents';\nimport { Data, LooseObject, ScaleOption, ViewCfg } from '../../interface';\nimport { createScaleByField, syncScale, getDefaultCategoryScaleRange } from '../../util/scale';\n\n/** @ignore */\ninterface ScaleMeta {\n readonly key: string;\n readonly scale: Scale;\n scaleDef: ScaleOption;\n syncKey?: string;\n}\n\n/** @ignore */\nexport class ScalePool {\n /** 所有的 scales */\n private scales = new Map<string, ScaleMeta>();\n /** 需要同步的 scale 分组, key: scaleKeyArray */\n private syncScales = new Map<string, string[]>();\n\n /**\n * 创建 scale\n * @param field\n * @param data\n * @param scaleDef\n * @param key\n */\n public createScale(field: string, data: Data, scaleDef: ScaleOption, key: string): Scale {\n let finalScaleDef = scaleDef;\n\n const cacheScaleMeta = this.getScaleMeta(key);\n if (data.length === 0 && cacheScaleMeta) {\n // 在更新过程中数据变为空,同时 key 对应的 scale 已存在则保持 scale 同类型\n const cacheScale = cacheScaleMeta.scale;\n const cacheScaleDef: LooseObject = {\n type: cacheScale.type,\n };\n if (cacheScale.isCategory) {\n // 如果是分类类型,保持 values\n cacheScaleDef.values = cacheScale.values;\n }\n finalScaleDef = deepMix(cacheScaleDef, cacheScaleMeta.scaleDef, scaleDef);\n }\n\n const scale = createScaleByField(field, data, finalScaleDef);\n\n // 缓存起来\n this.cacheScale(scale, scaleDef, key);\n\n return scale;\n }\n\n /**\n * 同步 scale\n */\n public sync(coordinate: Coordinate, theme: ViewCfg['theme']) {\n // 对于 syncScales 中每一个 syncKey 下面的 scale 数组进行同步处理\n this.syncScales.forEach((scaleKeys: string[], syncKey: string) => {\n // min, max, values, ranges\n let min = Number.MAX_SAFE_INTEGER;\n let max = Number.MIN_SAFE_INTEGER;\n const values = [];\n\n // 1. 遍历求得最大最小值,values 等\n each(scaleKeys, (key: string) => {\n const scale = this.getScale(key);\n\n max = isNumber(scale.max) ? Math.max(max, scale.max) : max;\n min = isNumber(scale.min) ? Math.min(min, scale.min) : min;\n\n // 去重\n each(scale.values, (v: any) => {\n if (!values.includes(v)) {\n values.push(v);\n }\n });\n });\n\n // 2. 同步\n each(scaleKeys, (key: string) => {\n const scale = this.getScale(key);\n\n if (scale.isContinuous) {\n scale.change({\n min,\n max,\n values,\n });\n } else if (scale.isCategory) {\n let range = scale.range;\n const cacheScaleMeta = this.getScaleMeta(key);\n\n // 存在 value 值,且用户没有配置 range 配置 to fix https://github.com/antvis/G2/issues/2996\n if (values && !get(cacheScaleMeta, ['scaleDef', 'range'])) {\n // 更新 range\n range = getDefaultCategoryScaleRange(\n deepMix({}, scale, {\n values,\n }),\n coordinate,\n theme\n );\n }\n scale.change({\n values,\n range,\n });\n }\n });\n });\n }\n\n /**\n * 缓存一个 scale\n * @param scale\n * @param scaleDef\n * @param key\n */\n private cacheScale(scale: Scale, scaleDef: ScaleOption, key: string) {\n // 1. 缓存到 scales\n\n let sm = this.getScaleMeta(key);\n // 存在则更新,同时检测类型是否一致\n if (sm && sm.scale.type === scale.type) {\n syncScale(sm.scale, scale);\n sm.scaleDef = scaleDef;\n // 更新 scaleDef\n } else {\n sm = {\n key,\n scale,\n scaleDef,\n };\n\n this.scales.set(key, sm);\n }\n\n // 2. 缓存到 syncScales,构造 Record<sync, string[]> 数据结构\n const syncKey = this.getSyncKey(sm);\n sm.syncKey = syncKey; // 设置 sync 同步的 key\n\n // 因为存在更新 scale 机制,所以在缓存之前,先从原 syncScales 中去除 sync 的缓存引用\n this.removeFromSyncScales(key);\n\n // 存在 sync 标记才进行 sync\n if (syncKey) {\n // 不存在这个 syncKey,则创建一个空数组\n let scaleKeys = this.syncScales.get(syncKey);\n if (!scaleKeys) {\n scaleKeys = [];\n this.syncScales.set(syncKey, scaleKeys);\n }\n scaleKeys.push(key);\n }\n }\n\n /**\n * 通过 key 获取 scale\n * @param key\n */\n public getScale(key: string): Scale {\n let scaleMeta = this.getScaleMeta(key);\n if (!scaleMeta) {\n const field = last(key.split('-'));\n const scaleKeys = this.syncScales.get(field);\n if (scaleKeys && scaleKeys.length) {\n scaleMeta = this.getScaleMeta(scaleKeys[0]);\n }\n }\n return scaleMeta && scaleMeta.scale;\n }\n\n /**\n * 在 view 销毁的时候,删除 scale 实例,防止内存泄露\n * @param key\n */\n public deleteScale(key: string) {\n const scaleMeta = this.getScaleMeta(key);\n if (scaleMeta) {\n const { syncKey } = scaleMeta;\n\n const scaleKeys = this.syncScales.get(syncKey);\n\n // 移除同步的关系\n if (scaleKeys && scaleKeys.length) {\n const idx = scaleKeys.indexOf(key);\n\n if (idx !== -1) {\n scaleKeys.splice(idx, 1);\n }\n }\n }\n\n // 删除 scale 实例\n this.scales.delete(key);\n }\n\n /**\n * 清空\n */\n public clear() {\n this.scales.clear();\n this.syncScales.clear();\n }\n\n /**\n * 删除 sync scale 引用\n * @param key\n */\n private removeFromSyncScales(key: string) {\n this.syncScales.forEach((scaleKeys: string[], syncKey: string) => {\n const idx = scaleKeys.indexOf(key);\n\n if (idx !== -1) {\n scaleKeys.splice(idx, 1);\n\n // 删除空数组值\n if (scaleKeys.length === 0) {\n this.syncScales.delete(syncKey);\n }\n\n return false; // 跳出循环\n }\n });\n }\n\n /**\n * get sync key\n * @param sm\n */\n private getSyncKey(sm: ScaleMeta): string {\n const { scale, scaleDef } = sm;\n const { field } = scale;\n const sync = get(scaleDef, ['sync']);\n\n // 如果 sync = true,则直接使用字段名作为 syncKey\n return sync === true ? field : sync === false ? undefined : sync;\n }\n\n /**\n * 通过 key 获取 scale\n * @param key\n */\n private getScaleMeta(key: string): ScaleMeta {\n return this.scales.get(key);\n }\n}\n"]}
\No newline at end of file