efront 4.22.19 → 4.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +6 -0
  2. package/apps/kugou/search/search.js +4 -3
  3. package/apps/noice/main.js +1 -1
  4. package/apps/pivot/auth/login.js +4 -4
  5. package/apps/pivot/dht/list.js +5 -5
  6. package/apps/pivot/link/chat.js +1 -1
  7. package/apps/pivot/link/index.js +1 -1
  8. package/apps/pivot/link/list.js +5 -4
  9. package/apps/pivot/share/list.js +6 -5
  10. package/apps/pivot/wow/root.js +3 -2
  11. package/coms/basic/LoadingArray.js +1 -0
  12. package/coms/basic/cross_.js +4 -1
  13. package/coms/basic/data.js +16 -13
  14. package/coms/basic_/WeakMap.js +23 -0
  15. package/coms/compile/Javascript.js +2 -1
  16. package/coms/explorer/context.js +10 -7
  17. package/coms/explorer/edit.js +1 -1
  18. package/coms/explorer/fileitem.js +9 -7
  19. package/coms/explorer/main.js +20 -17
  20. package/coms/frame/chat.js +17 -16
  21. package/coms/frame/list.js +6 -5
  22. package/coms/kugou/bindScroll.js +0 -1
  23. package/coms/kugou/buildScroll.js +5 -4
  24. package/coms/kugou/krc.js +2 -2
  25. package/coms/kugou/player.js +2 -2
  26. package/coms/kugou/song.js +1 -1
  27. package/coms/layer/leftCenter.js +5 -5
  28. package/coms/pivot/checkGeo.js +0 -1
  29. package/coms/zimoli/$eval.js +1 -0
  30. package/coms/zimoli/$mounted.js +1 -0
  31. package/coms/zimoli/$parented.js +1 -0
  32. package/coms/zimoli/$renders.js +1 -0
  33. package/coms/zimoli/$scoped.js +1 -0
  34. package/coms/zimoli/$structed.js +1 -0
  35. package/coms/zimoli/HexEditor.js +1 -1
  36. package/coms/zimoli/appendChild.js +2 -2
  37. package/coms/zimoli/autodragchildren_test.js +1 -1
  38. package/coms/zimoli/checkbox.js +1 -1
  39. package/coms/zimoli/container.js +4 -3
  40. package/coms/zimoli/createItemTarget.js +10 -6
  41. package/coms/zimoli/cross.js +1 -1
  42. package/coms/zimoli/field.js +3 -3
  43. package/coms/zimoli/gallery_test.js +4 -3
  44. package/coms/zimoli/getArgsChildren.js +1 -1
  45. package/coms/zimoli/getGenerator.js +36 -28
  46. package/coms/zimoli/grid.js +2 -2
  47. package/coms/zimoli/isMounted.js +6 -3
  48. package/coms/zimoli/lattice.js +2 -4
  49. package/coms/zimoli/maps.js +1 -2
  50. package/coms/zimoli/menu.js +1 -0
  51. package/coms/zimoli/menuItem.js +4 -3
  52. package/coms/zimoli/menuList.js +8 -8
  53. package/coms/zimoli/menu_test.js +4 -3
  54. package/coms/zimoli/model.js +8 -6
  55. package/coms/zimoli/on.js +28 -20
  56. package/coms/zimoli/picture.js +0 -7
  57. package/coms/zimoli/radio.js +1 -1
  58. package/coms/zimoli/remove.js +3 -3
  59. package/coms/zimoli/render.js +193 -99
  60. package/coms/zimoli/scrollbar.js +90 -42
  61. package/coms/zimoli/scrollbar.less +5 -3
  62. package/coms/zimoli/select.js +3 -3
  63. package/coms/zimoli/selectList.js +1 -1
  64. package/coms/zimoli/selectListEdit.js +5 -4
  65. package/coms/zimoli/table.html +6 -4
  66. package/coms/zimoli/table.js +82 -41
  67. package/coms/zimoli/table.less +22 -0
  68. package/coms/zimoli/vbox.less +2 -2
  69. package/coms/zimoli/zimoli.js +6 -5
  70. package/docs/version-desc.md +3 -1
  71. package/docs//347/211/210/346/234/254/350/257/264/346/230/216.md +3 -1
  72. package/package.json +1 -1
  73. package/public/efront.js +1 -1
@@ -1,6 +1,7 @@
1
1
  var hasOwnProperty = {}.hasOwnProperty;
2
2
  var renderElements = Object.create(null);
3
3
  var presets = Object.create(null);
4
+ var renderIds = new WeakMap;
4
5
  var copyAttribute = function (node, copys) {
5
6
  for (var { name, value } of copys) switch (name.toLowerCase()) {
6
7
  case "class":
@@ -24,8 +25,9 @@ var createTemplateNodes = function (text) {
24
25
  if (isEmpty(text)) return;
25
26
  if (isNode(text)) {
26
27
  var node = text;
27
- if (isElement(node) && this.$struct.copys) {
28
- copyAttribute(node, this.$struct.copys);
28
+ var struct = $structed.get(this);
29
+ if (isElement(node) && struct.copys) {
30
+ copyAttribute(node, struct.copys);
29
31
  }
30
32
  this.with = [node];
31
33
  return;
@@ -35,14 +37,27 @@ var createTemplateNodes = function (text) {
35
37
  this.with = Array.apply(null, node.childNodes);
36
38
  }
37
39
  appendChild.after(this, this.with);
38
- this.with = render(this.with, this.$scope, this.$parentScopes, this.$renderid !== 9);
40
+ this.with = render(this.with, $scoped.get(this), $parented.get(this), renderIds.get(this) !== 9);
39
41
  };
42
+ var createCloner = function (node) {
43
+ var $struct = $structed.get(node);
44
+ var parentScopes = getScopeList(node);
45
+ return function (id, scope) {
46
+ var clone = node.cloneNode(true);
47
+ $scoped.set(clone, scope);
48
+ $parented.set(clone, parentScopes);
49
+ $structed.set(clone, $struct);
50
+ renderIds.set(clone, id);
51
+ return clone;
52
+ }
53
+ };
54
+
40
55
  presets.template = function (t) {
41
56
  var comment = document.createComment('template');
42
- comment.$scope = t.$scope;
43
- comment.$parentScopes = t.$parentScopes;
57
+ $scoped.set(comment, $scoped.get(t));
58
+ $parented.set(comment, $parented.get(t));
44
59
  t.$comment = comment;
45
- if (t.$struct.binds.src) {
60
+ if ($structed.get(t).binds.src) {
46
61
  care(comment, createTemplateNodes)
47
62
  }
48
63
  else {
@@ -61,18 +76,19 @@ var addRenderElement = function () {
61
76
  var element = this;
62
77
  if (!isNode(element)) return;
63
78
  buildFirst(element);
64
- if (element.$renderid > 10) {
65
- renderElements[element.$renderid] = element;
79
+ var renderid = renderIds.get(element);
80
+ if (renderid > 10) {
81
+ renderElements[renderid] = element;
66
82
  }
67
83
  };
68
84
  var removeRenderElement = function () {
69
85
  var element = this;
70
- delete renderElements[element.$renderid];
86
+ delete renderElements[renderIds.get(element)];
71
87
  };
72
88
  function refresh(root) {
73
89
  var rest = [];
74
90
  var body = document.documentElement;
75
- if (root && root.$renders) {
91
+ if (root && $renders.has(root)) {
76
92
  for (var k in renderElements) {
77
93
  var element = renderElements[k];
78
94
  if (
@@ -121,11 +137,11 @@ function rebuild(element, isFirstRender) {
121
137
  if (isFirstRender) delete element.$ready;
122
138
  if (element.$digest) digests.push(element);
123
139
  if (!element.$needchanges) {
124
- element.$renders.forEach(a => a.call(element));
140
+ $renders.get(element).forEach(a => a.call(element));
125
141
  return;
126
142
  }
127
143
  var props = getWatchData(isFirstRender ? { $watches: element.$watches } : element);
128
- element.$renders.forEach(a => a.call(element));
144
+ $renders.get(element).forEach(a => a.call(element));
129
145
  var capture = null;
130
146
  for (var k in props) {
131
147
  var current = element[k];
@@ -139,8 +155,12 @@ function rebuild(element, isFirstRender) {
139
155
  var variableReg = /([^\:\,\+\=\-\!%\^\|\/\&\*\!\;\?\>\<~\{\}\s\[\]\(\)]|\?\s*\.(?=[^\d])|\s*\.\s*)+/g;
140
156
  var variableOnlyReg = new RegExp(`^${variableReg.source}$`);
141
157
  var getScopeList = function (element) {
142
- var scopes = (element.$parentScopes || []).concat();
143
- if (element.$scope) scopes.push(element.$scope);
158
+ var scopes = $parented.get(element);
159
+ var s = $scoped.get(element);
160
+ if (s) {
161
+ if (scopes) scopes = scopes.slice(), scopes.push(s);
162
+ else scopes = [s];
163
+ }
144
164
  return scopes;
145
165
  };
146
166
  var toNull = () => null;
@@ -179,10 +199,10 @@ var createGetter = function (target, search, isprop = true) {
179
199
  };
180
200
  var createComment = function (renders, type, expression) {
181
201
  var comment = document.createComment(`${type} ${expression}`);
182
- comment.$renders = renders;
183
- comment.$scope = this.$scope;
184
- comment.$struct = this.$struct;
185
- comment.$parentScopes = this.$parentScopes;
202
+ $renders.set(comment, renders);
203
+ $scoped.set(comment, $scoped.get(this));
204
+ $structed.set(comment, $structed.get(this));
205
+ $parented.set(comment, $parented.get(this));
186
206
  if (this.parentNode) {
187
207
  appendChild.after(this, comment);
188
208
  if (!/^if|^else/i.test(type)) remove(this);
@@ -193,8 +213,8 @@ var createComment = function (renders, type, expression) {
193
213
  };
194
214
 
195
215
  var initialComment = function (comment) {
196
- if (comment.$struct.once) {
197
- comment.$renderid = 9;
216
+ if ($structed.get(comment).once) {
217
+ renderIds.set(comment, 9);
198
218
  }
199
219
  renderlock.push(comment);
200
220
  };
@@ -261,7 +281,7 @@ var getClonedElements = function (clones, repsrc) {
261
281
  var newmap = [];
262
282
  var inc = 0;
263
283
  clones.forEach((c, i) => {
264
- var m = c.$scope.$item;
284
+ var m = $scoped.get(c).$item;
265
285
  switch (m) {
266
286
  case repsrc[inc]: delete clones[i]; newmap[inc++] = c; break;
267
287
  case repsrc[inc + 1]: delete clones[i]; inc++; newmap[inc++] = c; break;
@@ -269,6 +289,7 @@ var getClonedElements = function (clones, repsrc) {
269
289
  });
270
290
  return newmap;
271
291
  }
292
+ var repeats = new WeakMap;
272
293
  var createRepeat = function (search, id = 0) {
273
294
  // 懒渲染
274
295
  // throw new Error("repeat is not supported! use list component instead");
@@ -279,7 +300,7 @@ var createRepeat = function (search, id = 0) {
279
300
  // 懒渲染
280
301
  var getter = createGetter(this, srcName);
281
302
  var element = this, clonedElements = [], savedValue, savedOrigin;
282
- if (this.$struct.if) id = -7;
303
+ if ($structed.get(this).if) id = -7;
283
304
  var renders = [function () {
284
305
  var result = getter(this);
285
306
  var origin = result;
@@ -294,11 +315,7 @@ var createRepeat = function (search, id = 0) {
294
315
  if (keys.length > 600) {
295
316
  throw new Error(i18n`数据量过大,取消绘制!`);
296
317
  }
297
- var $parentScopes = element.$parentScopes || [];
298
- var $struct = element.$struct;
299
- if (element.$scope) {
300
- $parentScopes = $parentScopes.slice(), $parentScopes.push(element.$scope);
301
- }
318
+ var cloner = createCloner(element);
302
319
  var clonedElements1 = isArrayResult ? [] : Object.create(null);
303
320
  if (isArrayResult && !trackBy && clonedElements instanceof Array) {
304
321
  clonedElements1 = getClonedElements(clonedElements, result);
@@ -309,7 +326,7 @@ var createRepeat = function (search, id = 0) {
309
326
  if (trackBy) {
310
327
  k = seek($scope, trackBy);
311
328
  if (clonedElements[k]) {
312
- Object.assign(clonedElements[k].$repeat, $scope)
329
+ Object.assign(repeats.get(clonedElements[k]), $scope)
313
330
  return clonedElements1[k] = clonedElements[k];
314
331
  }
315
332
  }
@@ -317,7 +334,7 @@ var createRepeat = function (search, id = 0) {
317
334
  if (isArrayResult) {
318
335
  var c = clonedElements1[k];
319
336
  if (c) {
320
- Object.assign(c.$repeat, $scope);
337
+ Object.assign(repeats.get(c), $scope);
321
338
  return c;
322
339
  }
323
340
  }
@@ -326,16 +343,14 @@ var createRepeat = function (search, id = 0) {
326
343
  if (!c) c = clonedElements[k];
327
344
  else c = null;
328
345
  if (c) {
329
- Object.assign(c.$repeat, $scope);
346
+ Object.assign(repeats.get(c), $scope);
330
347
  return clonedElements1[k] = c;
331
348
  }
332
349
  }
333
350
  }
334
- var clone = element.cloneNode(true);
335
- clone.$renderid = id;
336
- clone.$repeat = clone.$scope = $scope;
337
- clone.$parentScopes = $parentScopes;
338
- clone.$struct = $struct;
351
+
352
+ var clone = cloner(id, $scope);
353
+ repeats.set(clone, $scope);
339
354
  clonedElements1[k] = clone;
340
355
  return clone;
341
356
  }, this);
@@ -381,8 +396,8 @@ var ifset = function (shouldMount) {
381
396
  if (cx === shouldMount) {
382
397
  var e = c.$template;
383
398
  if (c.nextSibling !== e) appendChild.after(c, e);
384
- if (e.$renderid < 0) {
385
- e.$renderid = this.$id;
399
+ if (renderIds.get(e) < 0) {
400
+ renderIds.set(e, this.$id);
386
401
  e = c.$template = render(e);
387
402
  e.$comment = c;
388
403
  }
@@ -399,7 +414,7 @@ var createIf = function (search, id = 0) {
399
414
  var elements = [element, getter];
400
415
  if_top.push(elements);
401
416
  elements.parent = this.parentNode;
402
- if (this.$struct.repeat) id = -3;
417
+ if ($structed.get(this).repeat) id = -3;
403
418
  var comment = elements[0] = createComment.call(element, [new Binder2(ifget, ifset)], 'if', search);
404
419
  comment.$id = id;
405
420
  comment.$elements = elements;
@@ -470,16 +485,14 @@ var parseIfWithRepeat = function (ifExpression, repeatExpression) {
470
485
  };
471
486
  };
472
487
 
473
- var mountElementIds = function (element, ids) {
474
- var scope = element.$scope;
475
- if (!scope) return;
488
+ var mountElementIds = function (scope, element, ids) {
476
489
  for (var id of ids) {
477
490
  if (isHandled(scope[id]) && scope[id] !== element) throw new Error(i18n`同一个id不能使用两次:` + id);
478
491
  scope[id] = element;
479
492
  }
480
493
  }
481
494
  var renderStructure = function (element) {
482
- var $struct = element.$struct;
495
+ var $struct = $structed.get(element);
483
496
  if ($struct.if) var { name: ifkey, key, value: ifexp } = $struct.if;
484
497
  if ($struct.repeat) var { value: repeat } = $struct.repeat;
485
498
  if (!ifkey) return createRepeat.call(element, repeat);
@@ -531,7 +544,8 @@ var createMapper = function (write, mapper) {
531
544
  return function (search) {
532
545
  var getter = isArray(search) ? search.map(s => createGetter(this, s)) : createGetter(this, search);
533
546
  var oldValue = mapper();
534
- this.$renders.push(function () {
547
+ var renders = $renders.get(this);
548
+ renders.push(function () {
535
549
  var value = mapper(isArray(getter) ? getter.map(g => g(this)) : getter(this));
536
550
  var changes = getChanges(value, oldValue);
537
551
  if (!changes) return;
@@ -579,7 +593,7 @@ var createBinder2 = function (write, read) {
579
593
  return function (search) {
580
594
  var getter = createGetter(this, search);
581
595
  var oldValue = isFunction(read) ? read.call(this) : undefined;
582
- this.$renders.push(new Binder2(getter, write, oldValue));
596
+ $renders.get(this).push(new Binder2(getter, write, oldValue));
583
597
  };
584
598
  }
585
599
 
@@ -590,7 +604,7 @@ var src2 = function (search) {
590
604
  // 非直传数组的数据源变动后,不再检查其所有属性是否相同,直接同步到组件,
591
605
  // 直传数组的数据源以数组中的子项是否变动为准,
592
606
  // 直传数组的判别标准为表达式以“[”开头以“]”结尾,且表达式中间不含“]”
593
- this.$renders.push(function () {
607
+ $renders.get(this).push(function () {
594
608
  var origin = getter(this);
595
609
  if (isArray(origin)) {
596
610
  if (isArray(savedValue)) {
@@ -669,7 +683,7 @@ class Model {
669
683
  }
670
684
  hook(elem, emit) {
671
685
  var binder = new Binder2(this.gs, this.target !== elem ? this.sv.bind(this.target) : this.sv);
672
- elem.$renders.push(binder);
686
+ $renders.get(elem).push(binder);
673
687
  binder.call(elem);
674
688
  this.bd = binder;
675
689
  if (emit !== false) {
@@ -754,7 +768,7 @@ var binders = {
754
768
  this[attr] = this[attr.replace(/\-[a-z]/g, a => a.toUpperCase())] = value;
755
769
  }
756
770
  };
757
- this.$renders.push(hook);
771
+ $renders.get(this).push(hook);
758
772
  return hook;
759
773
  },
760
774
  ""(attr, search) {
@@ -774,7 +788,7 @@ var binders = {
774
788
  }
775
789
  } else if (this.getAttribute(attr) !== value) this.setAttribute(attr, value);
776
790
  }
777
- this.$renders.push(hook);
791
+ $renders.get(this).push(hook);
778
792
  return hook;
779
793
  }
780
794
  };
@@ -791,23 +805,28 @@ class Emitter {
791
805
  if (parsedSrc instanceof Repeater) {
792
806
  if (e.active || e.currentTarget) var target = e.active || (e.currentTarget === elem ? e.target || e.srcElem || e.currentTarget : e.currentTarget);
793
807
  else var target = e.target;
808
+ var es = $scoped.get(elem);
794
809
  if (target === elem) {
795
810
  scope = parsedSrc.createScope();
796
811
  }
797
812
  else {
798
- let scopes = target && target.$parentScopes;
813
+ let scopes = target && $parented.get(target);
799
814
  if (scopes) {
800
815
  var scope = null;
801
816
  for (var cx = scopes.length - 1; cx >= 0; cx--) {
802
817
  var s = scopes[cx];
803
- if (s === elem.$scope) {
818
+ if (s === es) {
804
819
  scope = scopes[cx + 1];
805
820
  break;
806
821
  }
807
822
  }
808
823
  }
809
824
  }
810
- if (!scope && target.$scope !== elem.$scope) scope = target.$scope;
825
+
826
+ if (!scope) {
827
+ var ts = $scoped.get(target);
828
+ if (es !== ts) scope = ts;
829
+ }
811
830
  }
812
831
  var res;
813
832
  if (scope) {
@@ -883,14 +902,24 @@ function renderBinds(element, binds) {
883
902
  h.call(element);
884
903
  }
885
904
  }
886
- function renderDynamics(element, replacer, binds, attrs) {
887
- var renders = element.$renders;
905
+ var getUserRenders = function (element) {
906
+ var renders = $renders.get(element);
888
907
  if (element.renders) {
889
908
  if (!renders) renders = [];
890
909
  renders.push.apply(renders, element.renders);
891
910
  delete element.renders;
892
911
  }
893
- element.$renders = [];
912
+ if (element.$renders) {
913
+ if (!renders) renders = [];
914
+ renders.push.apply(renders, element.$renders);
915
+ delete element.$renders;
916
+ }
917
+ return renders;
918
+ }
919
+ function renderDynamics(element, replacer, binds, attrs) {
920
+ var renders = getUserRenders(element);
921
+ var element_renders = [];
922
+ $renders.set(element, element_renders);
894
923
  var bindWatch = !!element.$needchanges;
895
924
  for (var k in binds) {
896
925
  if (k in directives) {
@@ -908,7 +937,7 @@ function renderDynamics(element, replacer, binds, attrs) {
908
937
  for (var k in attrs) {
909
938
  binders[""].call(element, k, attrs[k]);
910
939
  }
911
- if (renders && renders.length) element.$renders.push.apply(element.$renders, renders);
940
+ if (renders && renders.length) element_renders.push.apply(element_renders, renders);
912
941
  if (binds.src) directives.src.call(element, binds.src);
913
942
  }
914
943
 
@@ -939,53 +968,52 @@ function renderArray(children, scope, parentScopes, once) {
939
968
  function getChildren(element) {
940
969
  var children = element.children;
941
970
  if (!children || !children.length) return;
942
- var children = Array.prototype.filter.call(children, a => !a.$renderid);
971
+ var children = Array.prototype.filter.call(children, a => !renderIds.get(a));
943
972
  return children
944
973
  }
945
- function renderElement(element, scope = element.$scope, parentScopes = element.$parentScopes, once) {
974
+ function renderElement(element, scope = $scoped.get(element), parentScopes = $parented.get(element), once) {
946
975
  if (isArrayLike(element)) {
947
976
  return renderArray(Array.apply(null, element), scope, parentScopes, once);
948
977
  }
949
978
  if (!isElement(element)) {
950
979
  return element;
951
980
  }
952
- if (!isNumber(element.$renderid)) {
953
- element.$renderid = 0;
954
- element.$scope = scope;
981
+ if (!renderIds.get(element)) {
982
+ renderIds.set(element, 0);
955
983
  if (isHandled(parentScopes) && !isArray(parentScopes)) {
956
984
  throw new Error(i18n`父级作用域链应以数组的类型传入`);
957
985
  }
958
986
  if (parentScopes) {
959
- if (element.$renderid && !element.$parentScopes || element.$parentScopes && element.$parentScopes.length !== parentScopes.length) {
987
+ var eps = $parented.get(element);
988
+ if (eps && eps.length !== parentScopes.length) {
960
989
  throw new Error(i18n`父作用域链的长度必须相等着`);
961
990
  }
962
991
  }
963
992
  var s = createStructure(element);
964
- element.$struct = s;
965
- mountElementIds(element, s.ids);
966
993
  if (isEmpty(s.once)) s.once = once;
967
- element.$eval = $eval;
968
994
  }
969
- element.$scope = scope;
970
- element.$parentScopes = parentScopes || [];
971
- if (element.$renderid <= -1) element = renderStructure(element);
995
+ $scoped.set(element, scope);
996
+ $parented.set(element, parentScopes || []);
997
+ if (renderIds.get(element) <= -1) element = renderStructure(element);
972
998
  if (!element) return;
973
- if (element.$renderid < 0 || element.nodeType !== 1) {
999
+ if (renderIds.get(element) < 0 || element.nodeType !== 1) {
974
1000
  return element;
975
1001
  }
976
- var isFirstRender = !element.$renderid;
1002
+ var $struct = $structed.get(element);
1003
+ mountElementIds(scope, element, $struct.ids);
1004
+ var isFirstRender = !renderIds.get(element);
977
1005
  if (isFirstRender) {
978
1006
  var lockid = renderlock.length;
979
1007
  renderlock[lockid] = null;
980
- element.$renderid = 1;
1008
+ renderIds.set(element, 1);
981
1009
  var parentNode = element.parentNode;
982
1010
  if (parentNode) {
983
- if (parentNode.$renderid > 1 || isMounted(parentNode)) element.$renderid = 2;
1011
+ if (renderIds.get(parentNode) > 1 || isMounted(parentNode)) renderIds.set(element, 2);
984
1012
  }
985
- var $struct = element.$struct;
986
- element.$renders = element.$renders || element.renders ? [].concat(element.$renders || [], element.renders || []) : [];
1013
+ var renders = getUserRenders(element) || [];
1014
+ $renders.set(element, renders);
987
1015
  var { copys, binds, once, props } = $struct;
988
- if (once) element.$renderid = 9;
1016
+ if (once) renderIds.set(element, 9);
989
1017
  if (binds.src) {
990
1018
  element.$src = parseRepeat(binds.src);
991
1019
  }
@@ -999,38 +1027,38 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
999
1027
  if (element === replacer) {
1000
1028
  var struct1 = createStructure(element, false);
1001
1029
  renderRest(element, struct1);
1002
- element.$scope = scope;
1030
+ $scoped.set(element, scope);
1003
1031
  }
1004
1032
  else if (isNode(replacer)) {
1005
- if (isElement(replacer) && !replacer.$renderid) {
1006
- if (!replacer.$scope) replacer.$scope = scope;
1007
- if (!replacer.$parentScopes) replacer.$parentScopes = parentScopes;
1008
- createStructure(replacer);
1009
- renderRest(replacer, replacer.$struct);
1033
+ if (isElement(replacer) && !renderIds.get(replacer)) {
1034
+ if (!$scoped.has(replacer)) $scoped.set(replacer, scope);
1035
+ if (!$parented.has(replacer)) $parented.set(replacer, parentScopes);
1036
+ var struct = createStructure(replacer);
1037
+ renderRest(replacer, struct);
1010
1038
  }
1011
1039
  copyAttribute(replacer, copys);
1012
1040
  if (nextSibling) appendChild.before(nextSibling, replacer);
1013
1041
  else if (parentNode) appendChild(parentNode, replacer);
1014
1042
  if (element.parentNode === parentNode) remove(element);
1015
- if (!replacer.$renderid) replacer.$renderid = element.$renderid;
1016
- for (var id of element.$struct.ids) {
1043
+ if (!renderIds.get(replacer)) renderIds.set(replacer, renderIds.get(element));
1044
+ for (var id of $struct.ids) {
1017
1045
  scope[id] = replacer;
1018
1046
  }
1019
1047
  }
1020
1048
  }
1021
1049
  renderRest(element, $struct, replacer);
1022
1050
  if (isNode(replacer) && replacer !== element) {
1023
- if (!replacer.$renders) replacer.$renders = [];
1024
- replacer.$renders.push.apply(replacer.$renders, element.$renders);
1051
+ var reprenders = initRenders(replacer);
1052
+ reprenders.push.apply(reprenders, $renders.get(element));
1025
1053
  element = replacer;
1026
1054
  }
1027
- if (element.$digest || element.$renders.length) {
1055
+ if (element.$digest || $renders.get(element).length) {
1028
1056
  element.$ready = true;
1029
1057
  renderlock[lockid] = element;
1030
1058
  }
1031
1059
  else if (renderlock.length === lockid) renderlock.pop();
1032
1060
  }
1033
- renderArray(getChildren(element), element.$scope || scope, element.$parentScopes || parentScopes, once);
1061
+ renderArray(getChildren(element), $scoped.get(element) || scope, $parented.get(element) || parentScopes, once);
1034
1062
  return element;
1035
1063
  }
1036
1064
  var deepcontexts = [];
@@ -1058,7 +1086,7 @@ function $$eval(search, scopes, target = this, event) {
1058
1086
 
1059
1087
  function $eval(search, scope, event) {
1060
1088
  var scopes = getScopeList(this);
1061
- if (isHandled(scope) && scope !== this.$scope) scopes.push(scope);
1089
+ if (isHandled(scope) && scope !== $scoped.get(this)) scopes.push(scope);
1062
1090
  return $$eval.call(this, search, scopes, this, event);
1063
1091
  }
1064
1092
 
@@ -1124,7 +1152,10 @@ var pushid = function (ids, name) {
1124
1152
 
1125
1153
  function createStructure(element, useExists) {
1126
1154
  if (isArrayLike(element)) return Array.prototype.map.call(element, createStructure);
1127
- if (useExists !== false && element.$struct) return element.$struct;
1155
+ if (useExists !== false) {
1156
+ var s = $structed.get(element);
1157
+ if (s) return s;
1158
+ }
1128
1159
  if (element.nodeType !== 1) return;
1129
1160
  // 处理结构流
1130
1161
  var attributes = element.attributes;
@@ -1169,7 +1200,7 @@ function createStructure(element, useExists) {
1169
1200
  }
1170
1201
  var key = name.replace(/^(ng|v|.*?)\-/i, "").toLowerCase();
1171
1202
  if (structures.hasOwnProperty(key)) {
1172
- if (element.$renderid <= -2) {
1203
+ if (renderIds.get(element) <= -2) {
1173
1204
  if (/^if$|^else/i.test(key)) {
1174
1205
  if (types.if) {
1175
1206
  throw new Error(i18n`暂不支持在同一元素上使用多次if结构!`);
@@ -1186,8 +1217,8 @@ function createStructure(element, useExists) {
1186
1217
  else {
1187
1218
  types.repeat = attr;
1188
1219
  }
1189
- if (!element.$renderid) element.$renderid = -1;
1190
- else element.$renderid = -2;
1220
+ if (!renderIds.get(element)) renderIds.set(element, -1);
1221
+ else renderIds.set(element, -2);
1191
1222
  element.removeAttribute(name);
1192
1223
  continue;
1193
1224
  }
@@ -1279,14 +1310,15 @@ function createStructure(element, useExists) {
1279
1310
  }
1280
1311
  if (props["zimoli"] || props["fresh"] || props["once"]) once = true;
1281
1312
  else if (props["refresh"] || props["digest"] || props["mount"]) once = false;
1282
- element.$eval = $eval;
1283
- return element.$struct = new Struct(emits, waits, types, copys, binds, attr1, props, ids, once);
1313
+ var s = new Struct(emits, waits, types, copys, binds, attr1, props, ids, once);
1314
+ $structed.set(element, s);
1315
+ return s;
1284
1316
  }
1285
1317
  function unlock(element) {
1286
1318
  if (!element) return;
1287
- var { $renderid = 0 } = element;
1288
- if ($renderid !== 9) {
1289
- if ($renderid < 10) element.$renderid = ++renderidOffset;
1319
+ var rid = renderIds.get(element) || 0;
1320
+ if (rid !== 9) {
1321
+ if (rid < 10) renderIds.set(element, ++renderidOffset);
1290
1322
  on("append")(element, addRenderElement);
1291
1323
  onremove(element, removeRenderElement);
1292
1324
  if (element.nodeType === 8);
@@ -1307,13 +1339,16 @@ function renderUnlock(element) {
1307
1339
  function renderLock(element) {
1308
1340
  if (!renderlock) {
1309
1341
  renderlock = [];
1310
- element.$mounted = false;
1342
+ $mounted.set(element, false);
1311
1343
  return true;
1312
1344
  }
1313
1345
  return false;
1314
1346
  }
1315
1347
  var eagermount = false, renderlock = null;
1316
1348
  function render(element, scope, parentScopes, lazy = true) {
1349
+ // <!--
1350
+ if (isNode(element)) Object.defineProperties(element, $weaks);
1351
+ // -->
1317
1352
  var haslock = renderLock(element);
1318
1353
  var if_top_length = if_top.length;
1319
1354
  if (isFinite(scope) && arguments.length === 2) lazy = scope, scope = undefined;
@@ -1326,6 +1361,34 @@ function render(element, scope, parentScopes, lazy = true) {
1326
1361
  if (haslock) callDigest();
1327
1362
  return e;
1328
1363
  }
1364
+ // <!--
1365
+ var $weaks = (key, weak, tip = key + '(element)') => {
1366
+ var warn = gs => {
1367
+ if (tip) {
1368
+ console.warn(i18n`${`%c ${key} %c`}仅在开发环境存在,供开发者调试查看,${`%c${i18n`项目发布后将没有这个属性!`}%c`}`, 'color:red', 'color', 'color:cyan', 'color:');
1369
+ console.info(`要在代码中访问 ${"element." + key},可以用 ${tip + "." + gs + "(element)"} 代替!`);
1370
+ tip = null;
1371
+ }
1372
+ };
1373
+ return {
1374
+ configurable: true,
1375
+ enumerable: false,
1376
+ get() {
1377
+ warn("get");
1378
+ return weak.get(this);
1379
+ },
1380
+ set(v) {
1381
+ warn("set");
1382
+ return weak.set(this, v);
1383
+ }
1384
+ };
1385
+ };
1386
+ $weaks = {
1387
+ $scope: $weaks('$scope', $scoped, "$scoped"),
1388
+ $struct: $weaks('$struct', $structed, "$structed"),
1389
+ $parentScopes: $weaks('$parentScopes', $parented, "$parented"),
1390
+ };
1391
+ // -->
1329
1392
  var digest = lazy(refresh, -{});
1330
1393
  render.digest = render.apply = render.refresh = digest;
1331
1394
  render.parseRepeat = parseRepeat;
@@ -1354,7 +1417,22 @@ render.register = function (key, name) {
1354
1417
  }
1355
1418
  };
1356
1419
  render.getFromScopes = getFromScopes;
1420
+ render.findKey = function (express, element) {
1421
+ var scopes = getScopeList(element);
1422
+ return getFromScopes(express, null, scopes);
1423
+ };
1424
+ var $renderid = {
1425
+ get() {
1426
+ return renderIds.get(this);
1427
+ },
1428
+ set(v) {
1429
+ return renderIds.set(this, v);
1430
+ },
1431
+ configurable: true,
1432
+ enumerable: false
1433
+ };
1357
1434
  render.struct = createStructure;
1435
+ render.stepId = renderIds;
1358
1436
  render.mergeStruct = mergeStruct;
1359
1437
  render.Binder = Binder;
1360
1438
  render.Model = Model;
@@ -1366,7 +1444,12 @@ render.dynamic = function (target, binds, attrs) {
1366
1444
  renderDynamics(target, target, binds, attrs);
1367
1445
  };
1368
1446
  var initRenders = function (target) {
1369
- if (!target.$renders) target.$renders = [];
1447
+ var renders = $renders.get(target);
1448
+ if (!renders) {
1449
+ renders = [];
1450
+ $renders.set(target, renders);
1451
+ }
1452
+ return renders;
1370
1453
  };
1371
1454
  render.class = function (target, map) {
1372
1455
  initRenders(target);
@@ -1382,4 +1465,15 @@ render.on = function (target, map) {
1382
1465
  render.once = function (target, map) {
1383
1466
  return renderEmits.call(this, target, map, emiters.once);
1384
1467
  };
1385
- render.mount = unlock;
1468
+ render.eval = $eval;
1469
+ render.mount = unlock;
1470
+ render.getScopes = getScopeList;
1471
+ render.createCloner = createCloner;
1472
+ render.clone = function (template, id = renderIds.get(template)) {
1473
+ var clone = template.cloneNode(true);
1474
+ $structed.set(clone, $structed.get(template));
1475
+ renderIds.set(clone, id);
1476
+ $scoped.set(clone, $scoped.get(template));
1477
+ $parented.set(clone, $parented.get(template));
1478
+ return clone;
1479
+ }