|
11 | 11 | * ------------------------------------------------------------------------
|
12 | 12 | */
|
13 | 13 |
|
14 |
| -const mapData = (() => { |
15 |
| - const storeData = {} |
16 |
| - let id = 1 |
17 |
| - return { |
18 |
| - set(element, key, data) { |
19 |
| - if (typeof element.bsKey === 'undefined') { |
20 |
| - element.bsKey = { |
21 |
| - key, |
22 |
| - id |
23 |
| - } |
24 |
| - id++ |
25 |
| - } |
| 14 | +const elementMap = new Map() |
26 | 15 |
|
27 |
| - storeData[element.bsKey.id] = data |
28 |
| - }, |
29 |
| - get(element, key) { |
30 |
| - if (!element || typeof element.bsKey === 'undefined') { |
31 |
| - return null |
32 |
| - } |
33 |
| - |
34 |
| - const keyProperties = element.bsKey |
35 |
| - if (keyProperties.key === key) { |
36 |
| - return storeData[keyProperties.id] |
37 |
| - } |
| 16 | +export default { |
| 17 | + set(element, key, instance) { |
| 18 | + if (!elementMap.has(element)) { |
| 19 | + elementMap.set(element, new Map()) |
| 20 | + } |
38 | 21 |
|
39 |
| - return null |
40 |
| - }, |
41 |
| - delete(element, key) { |
42 |
| - if (typeof element.bsKey === 'undefined') { |
43 |
| - return |
44 |
| - } |
| 22 | + const instanceMap = elementMap.get(element) |
45 | 23 |
|
46 |
| - const keyProperties = element.bsKey |
47 |
| - if (keyProperties.key === key) { |
48 |
| - delete storeData[keyProperties.id] |
49 |
| - delete element.bsKey |
50 |
| - } |
| 24 | + // make it clear we only want one instance per element |
| 25 | + // can be removed later when multiple key/instances are fine to be used |
| 26 | + if (!instanceMap.has(key) && instanceMap.size !== 0) { |
| 27 | + // eslint-disable-next-line no-console |
| 28 | + console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`) |
| 29 | + return |
51 | 30 | }
|
52 |
| - } |
53 |
| -})() |
54 | 31 |
|
55 |
| -const Data = { |
56 |
| - setData(instance, key, data) { |
57 |
| - mapData.set(instance, key, data) |
| 32 | + instanceMap.set(key, instance) |
58 | 33 | },
|
59 |
| - getData(instance, key) { |
60 |
| - return mapData.get(instance, key) |
| 34 | + |
| 35 | + get(element, key) { |
| 36 | + if (elementMap.has(element)) { |
| 37 | + return elementMap.get(element).get(key) || null |
| 38 | + } |
| 39 | + |
| 40 | + return null |
61 | 41 | },
|
62 |
| - removeData(instance, key) { |
63 |
| - mapData.delete(instance, key) |
| 42 | + |
| 43 | + remove(element, key) { |
| 44 | + if (!elementMap.has(element)) { |
| 45 | + return |
| 46 | + } |
| 47 | + |
| 48 | + const instanceMap = elementMap.get(element) |
| 49 | + |
| 50 | + instanceMap.delete(key) |
| 51 | + |
| 52 | + // free up element references if there are no instances left for an element |
| 53 | + if (instanceMap.size === 0) { |
| 54 | + elementMap.delete(element) |
| 55 | + } |
64 | 56 | }
|
65 | 57 | }
|
66 |
| - |
67 |
| -export default Data |
0 commit comments