1 |
|
2 |
|
3 |
|
4 | import { deepMix, each, get, isNumber, last } from '@antv/util';
|
5 | import { createScaleByField, syncScale, getDefaultCategoryScaleRange } from '../../util/scale';
|
6 |
|
7 | var ScalePool = (function () {
|
8 | function ScalePool() {
|
9 |
|
10 | this.scales = new Map();
|
11 |
|
12 | this.syncScales = new Map();
|
13 | }
|
14 | |
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | ScalePool.prototype.createScale = function (field, data, scaleDef, key) {
|
22 | var finalScaleDef = scaleDef;
|
23 | var cacheScaleMeta = this.getScaleMeta(key);
|
24 | if (data.length === 0 && cacheScaleMeta) {
|
25 |
|
26 | var cacheScale = cacheScaleMeta.scale;
|
27 | var cacheScaleDef = {
|
28 | type: cacheScale.type,
|
29 | };
|
30 | if (cacheScale.isCategory) {
|
31 |
|
32 | cacheScaleDef.values = cacheScale.values;
|
33 | }
|
34 | finalScaleDef = deepMix(cacheScaleDef, cacheScaleMeta.scaleDef, scaleDef);
|
35 | }
|
36 | var scale = createScaleByField(field, data, finalScaleDef);
|
37 |
|
38 | this.cacheScale(scale, scaleDef, key);
|
39 | return scale;
|
40 | };
|
41 | |
42 |
|
43 |
|
44 | ScalePool.prototype.sync = function (coordinate, theme) {
|
45 | var _this = this;
|
46 |
|
47 | this.syncScales.forEach(function (scaleKeys, syncKey) {
|
48 |
|
49 | var min = Number.MAX_SAFE_INTEGER;
|
50 | var max = Number.MIN_SAFE_INTEGER;
|
51 | var values = [];
|
52 |
|
53 | each(scaleKeys, function (key) {
|
54 | var scale = _this.getScale(key);
|
55 | max = isNumber(scale.max) ? Math.max(max, scale.max) : max;
|
56 | min = isNumber(scale.min) ? Math.min(min, scale.min) : min;
|
57 |
|
58 | each(scale.values, function (v) {
|
59 | if (!values.includes(v)) {
|
60 | values.push(v);
|
61 | }
|
62 | });
|
63 | });
|
64 |
|
65 | each(scaleKeys, function (key) {
|
66 | var scale = _this.getScale(key);
|
67 | if (scale.isContinuous) {
|
68 | scale.change({
|
69 | min: min,
|
70 | max: max,
|
71 | values: values,
|
72 | });
|
73 | }
|
74 | else if (scale.isCategory) {
|
75 | var range = scale.range;
|
76 | var cacheScaleMeta = _this.getScaleMeta(key);
|
77 |
|
78 | if (values && !get(cacheScaleMeta, ['scaleDef', 'range'])) {
|
79 |
|
80 | range = getDefaultCategoryScaleRange(deepMix({}, scale, {
|
81 | values: values,
|
82 | }), coordinate, theme);
|
83 | }
|
84 | scale.change({
|
85 | values: values,
|
86 | range: range,
|
87 | });
|
88 | }
|
89 | });
|
90 | });
|
91 | };
|
92 | |
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 | ScalePool.prototype.cacheScale = function (scale, scaleDef, key) {
|
99 |
|
100 | var sm = this.getScaleMeta(key);
|
101 |
|
102 | if (sm && sm.scale.type === scale.type) {
|
103 | syncScale(sm.scale, scale);
|
104 | sm.scaleDef = scaleDef;
|
105 |
|
106 | }
|
107 | else {
|
108 | sm = {
|
109 | key: key,
|
110 | scale: scale,
|
111 | scaleDef: scaleDef,
|
112 | };
|
113 | this.scales.set(key, sm);
|
114 | }
|
115 |
|
116 | var syncKey = this.getSyncKey(sm);
|
117 | sm.syncKey = syncKey;
|
118 |
|
119 | this.removeFromSyncScales(key);
|
120 |
|
121 | if (syncKey) {
|
122 |
|
123 | var scaleKeys = this.syncScales.get(syncKey);
|
124 | if (!scaleKeys) {
|
125 | scaleKeys = [];
|
126 | this.syncScales.set(syncKey, scaleKeys);
|
127 | }
|
128 | scaleKeys.push(key);
|
129 | }
|
130 | };
|
131 | |
132 |
|
133 |
|
134 |
|
135 | ScalePool.prototype.getScale = function (key) {
|
136 | var scaleMeta = this.getScaleMeta(key);
|
137 | if (!scaleMeta) {
|
138 | var field = last(key.split('-'));
|
139 | var scaleKeys = this.syncScales.get(field);
|
140 | if (scaleKeys && scaleKeys.length) {
|
141 | scaleMeta = this.getScaleMeta(scaleKeys[0]);
|
142 | }
|
143 | }
|
144 | return scaleMeta && scaleMeta.scale;
|
145 | };
|
146 | |
147 |
|
148 |
|
149 |
|
150 | ScalePool.prototype.deleteScale = function (key) {
|
151 | var scaleMeta = this.getScaleMeta(key);
|
152 | if (scaleMeta) {
|
153 | var syncKey = scaleMeta.syncKey;
|
154 | var scaleKeys = this.syncScales.get(syncKey);
|
155 |
|
156 | if (scaleKeys && scaleKeys.length) {
|
157 | var idx = scaleKeys.indexOf(key);
|
158 | if (idx !== -1) {
|
159 | scaleKeys.splice(idx, 1);
|
160 | }
|
161 | }
|
162 | }
|
163 |
|
164 | this.scales.delete(key);
|
165 | };
|
166 | |
167 |
|
168 |
|
169 | ScalePool.prototype.clear = function () {
|
170 | this.scales.clear();
|
171 | this.syncScales.clear();
|
172 | };
|
173 | |
174 |
|
175 |
|
176 |
|
177 | ScalePool.prototype.removeFromSyncScales = function (key) {
|
178 | var _this = this;
|
179 | this.syncScales.forEach(function (scaleKeys, syncKey) {
|
180 | var idx = scaleKeys.indexOf(key);
|
181 | if (idx !== -1) {
|
182 | scaleKeys.splice(idx, 1);
|
183 |
|
184 | if (scaleKeys.length === 0) {
|
185 | _this.syncScales.delete(syncKey);
|
186 | }
|
187 | return false;
|
188 | }
|
189 | });
|
190 | };
|
191 | |
192 |
|
193 |
|
194 |
|
195 | ScalePool.prototype.getSyncKey = function (sm) {
|
196 | var scale = sm.scale, scaleDef = sm.scaleDef;
|
197 | var field = scale.field;
|
198 | var sync = get(scaleDef, ['sync']);
|
199 | // 如果 sync = true,则直接使用字段名作为 syncKey
|
200 | return sync === true ? field : sync === false ? undefined : sync;
|
201 | };
|
202 | /**
|
203 | * 通过 key 获取 scale
|
204 | * @param key
|
205 | */
|
206 | ScalePool.prototype.getScaleMeta = function (key) {
|
207 | return this.scales.get(key);
|
208 | };
|
209 | return ScalePool;
|
210 | }());
|
211 | export { ScalePool };
|
212 |
|
\ | No newline at end of file |