efront 4.22.18 → 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.
- package/#/345/233/275/351/231/205/345/214/226.yml +6 -0
- package/apps/kugou/search/search.js +4 -3
- package/apps/noice/main.js +1 -1
- package/apps/pivot/auth/login.js +4 -4
- package/apps/pivot/dht/list.js +5 -5
- package/apps/pivot/link/chat.js +1 -1
- package/apps/pivot/link/index.js +1 -1
- package/apps/pivot/link/list.js +5 -4
- package/apps/pivot/share/list.js +6 -5
- package/apps/pivot/wow/root.js +3 -2
- package/coms/basic/LoadingArray.js +1 -0
- package/coms/basic/cross_.js +4 -1
- package/coms/basic/data.js +16 -13
- package/coms/basic_/WeakMap.js +23 -0
- package/coms/compile/Javascript.js +2 -1
- package/coms/explorer/context.js +10 -7
- package/coms/explorer/edit.js +1 -1
- package/coms/explorer/fileitem.js +9 -7
- package/coms/explorer/main.js +20 -17
- package/coms/frame/chat.js +17 -16
- package/coms/frame/list.js +6 -5
- package/coms/kugou/bindScroll.js +0 -1
- package/coms/kugou/buildScroll.js +5 -4
- package/coms/kugou/krc.js +2 -2
- package/coms/kugou/player.js +2 -2
- package/coms/kugou/song.js +1 -1
- package/coms/layer/leftCenter.js +5 -5
- package/coms/pivot/checkGeo.js +0 -1
- package/coms/zimoli/$eval.js +1 -0
- package/coms/zimoli/$mounted.js +1 -0
- package/coms/zimoli/$parented.js +1 -0
- package/coms/zimoli/$renders.js +1 -0
- package/coms/zimoli/$scoped.js +1 -0
- package/coms/zimoli/$structed.js +1 -0
- package/coms/zimoli/HexEditor.js +1 -1
- package/coms/zimoli/appendChild.js +12 -20
- package/coms/zimoli/autodragchildren_test.js +1 -1
- package/coms/zimoli/checkbox.js +1 -1
- package/coms/zimoli/container.js +4 -3
- package/coms/zimoli/createItemTarget.js +10 -6
- package/coms/zimoli/cross.js +1 -1
- package/coms/zimoli/field.js +3 -3
- package/coms/zimoli/gallery_test.js +4 -3
- package/coms/zimoli/getArgsChildren.js +22 -0
- package/coms/zimoli/getGenerator.js +36 -28
- package/coms/zimoli/grid.js +2 -2
- package/coms/zimoli/isMounted.js +6 -3
- package/coms/zimoli/lattice.js +2 -4
- package/coms/zimoli/maps.js +1 -2
- package/coms/zimoli/menu.js +1 -0
- package/coms/zimoli/menuItem.js +4 -3
- package/coms/zimoli/menuList.js +8 -8
- package/coms/zimoli/menu_test.js +4 -3
- package/coms/zimoli/model.js +11 -6
- package/coms/zimoli/on.js +28 -20
- package/coms/zimoli/picture.js +0 -7
- package/coms/zimoli/popup.js +33 -2
- package/coms/zimoli/radio.js +1 -1
- package/coms/zimoli/remove.js +5 -14
- package/coms/zimoli/render.js +193 -99
- package/coms/zimoli/scrollbar.js +90 -42
- package/coms/zimoli/scrollbar.less +5 -3
- package/coms/zimoli/select.js +3 -3
- package/coms/zimoli/selectList.js +1 -1
- package/coms/zimoli/selectListEdit.js +5 -4
- package/coms/zimoli/table.html +6 -4
- package/coms/zimoli/table.js +82 -41
- package/coms/zimoli/table.less +22 -0
- package/coms/zimoli/vbox.less +2 -2
- package/coms/zimoli/zimoli.js +15 -8
- package/docs/version-desc.md +3 -1
- package/docs//347/211/210/346/234/254/350/257/264/346/230/216.md +3 -1
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/coms/zimoli/render.js
CHANGED
|
@@ -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
|
-
|
|
28
|
-
|
|
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
|
|
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
|
|
43
|
-
comment
|
|
57
|
+
$scoped.set(comment, $scoped.get(t));
|
|
58
|
+
$parented.set(comment, $parented.get(t));
|
|
44
59
|
t.$comment = comment;
|
|
45
|
-
if (t
|
|
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
|
-
|
|
65
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
143
|
-
|
|
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
|
|
183
|
-
comment
|
|
184
|
-
comment
|
|
185
|
-
comment
|
|
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
|
|
197
|
-
comment
|
|
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.$
|
|
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
|
|
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
|
|
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]
|
|
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
|
|
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
|
|
346
|
+
Object.assign(repeats.get(c), $scope);
|
|
330
347
|
return clonedElements1[k] = c;
|
|
331
348
|
}
|
|
332
349
|
}
|
|
333
350
|
}
|
|
334
|
-
|
|
335
|
-
clone
|
|
336
|
-
clone
|
|
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
|
|
385
|
-
e
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 ===
|
|
818
|
+
if (s === es) {
|
|
804
819
|
scope = scopes[cx + 1];
|
|
805
820
|
break;
|
|
806
821
|
}
|
|
807
822
|
}
|
|
808
823
|
}
|
|
809
824
|
}
|
|
810
|
-
|
|
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
|
|
887
|
-
var renders = element
|
|
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)
|
|
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
|
|
971
|
+
var children = Array.prototype.filter.call(children, a => !renderIds.get(a));
|
|
943
972
|
return children
|
|
944
973
|
}
|
|
945
|
-
function renderElement(element, scope = element
|
|
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 (!
|
|
953
|
-
element
|
|
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
|
-
|
|
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
|
|
970
|
-
element
|
|
971
|
-
if (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
|
|
999
|
+
if (renderIds.get(element) < 0 || element.nodeType !== 1) {
|
|
974
1000
|
return element;
|
|
975
1001
|
}
|
|
976
|
-
var
|
|
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
|
|
1008
|
+
renderIds.set(element, 1);
|
|
981
1009
|
var parentNode = element.parentNode;
|
|
982
1010
|
if (parentNode) {
|
|
983
|
-
if (parentNode
|
|
1011
|
+
if (renderIds.get(parentNode) > 1 || isMounted(parentNode)) renderIds.set(element, 2);
|
|
984
1012
|
}
|
|
985
|
-
var
|
|
986
|
-
|
|
1013
|
+
var renders = getUserRenders(element) || [];
|
|
1014
|
+
$renders.set(element, renders);
|
|
987
1015
|
var { copys, binds, once, props } = $struct;
|
|
988
|
-
if (once) element
|
|
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
|
|
1030
|
+
$scoped.set(element, scope);
|
|
1003
1031
|
}
|
|
1004
1032
|
else if (isNode(replacer)) {
|
|
1005
|
-
if (isElement(replacer) && !replacer
|
|
1006
|
-
if (
|
|
1007
|
-
if (
|
|
1008
|
-
createStructure(replacer);
|
|
1009
|
-
renderRest(replacer,
|
|
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
|
|
1016
|
-
for (var id of
|
|
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
|
-
|
|
1024
|
-
|
|
1051
|
+
var reprenders = initRenders(replacer);
|
|
1052
|
+
reprenders.push.apply(reprenders, $renders.get(element));
|
|
1025
1053
|
element = replacer;
|
|
1026
1054
|
}
|
|
1027
|
-
if (element.$digest ||
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1190
|
-
else element
|
|
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
|
-
|
|
1283
|
-
|
|
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
|
|
1288
|
-
if (
|
|
1289
|
-
if (
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
+
}
|