efront 3.17.2 → 3.18.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 (48) hide show
  1. package/apps/pivot/api/edit.js +1 -0
  2. package/apps/pivot/api/list.js +20 -0
  3. package/apps/pivot/api.yml +8 -4
  4. package/apps/pivot/dict/edit.js +1 -0
  5. package/apps/pivot/dict/list.js +12 -0
  6. package/apps/pivot/link/chat.js +29 -0
  7. package/apps/pivot/link/chat.less +5 -0
  8. package/apps/pivot/link/list.html +8 -3
  9. package/apps/pivot/link/list.js +23 -2
  10. package/apps/pivot/link/list.less +3 -0
  11. package/apps/pivot/menu.yml +4 -1
  12. package/apps/pivot/proxy/list.js +9 -8
  13. package/apps/pivot/task/list.js +1 -1
  14. package/apps/pivot/user/api.html +2 -0
  15. package/apps/pivot/user/api.js +14 -0
  16. package/apps/pivot/user/api.less +0 -0
  17. package/coms/basic/Speed.js +0 -1
  18. package/coms/basic/assert.js +5 -3
  19. package/coms/basic/lazy.js +19 -9
  20. package/coms/basic/lazy_test.js +62 -0
  21. package/coms/basic/parseURL.js +21 -2
  22. package/coms/basic/refilm_decode.js +4 -2
  23. package/coms/frame/chat.html +13 -0
  24. package/coms/frame/chat.js +39 -0
  25. package/coms/frame/chat.less +125 -0
  26. package/coms/frame/design.html +7 -0
  27. package/coms/frame/design.js +23 -0
  28. package/coms/frame/design.less +17 -0
  29. package/coms/frame/dict.js +21 -0
  30. package/coms/frame/edit.js +1 -1
  31. package/coms/frame/list.js +1 -1
  32. package/coms/frame/route.js +1 -0
  33. package/coms/kugou/song.html +1 -1
  34. package/coms/kugou/song.js +2 -1
  35. package/coms/pivot/pedit.js +3 -3
  36. package/coms/pivot/plist.js +2 -2
  37. package/coms/zimoli/cloneVisible.js +1 -0
  38. package/coms/zimoli/data.js +26 -12
  39. package/coms/zimoli/design.html +5 -4
  40. package/coms/zimoli/design.less +8 -3
  41. package/coms/zimoli/drag.js +1 -1
  42. package/coms/zimoli/field.html +1 -1
  43. package/coms/zimoli/list.js +5 -5
  44. package/coms/zimoli/model.js +4 -3
  45. package/coms/zimoli/render.js +49 -25
  46. package/coms/zimoli/vbox.js +2 -2
  47. package/package.json +1 -1
  48. package/public/efront.js +1 -1
@@ -0,0 +1,23 @@
1
+ function design(fields, types) {
2
+
3
+ var e = document.createElement("fields-designer");
4
+ e.innerHTML = template;
5
+ var e = view(e);
6
+ renderWithDefaults(e, {
7
+ fields: fields ? JSAM.parse(JSAM.stringify(fields)) : [],
8
+ design() {
9
+ return zimoli$design(this.fields, types);
10
+ },
11
+ remove() {
12
+ remove(e);
13
+ },
14
+ save() {
15
+ e.value = this.fields;
16
+ dispatch(e, 'changed');
17
+ remove(e);
18
+ }
19
+ });
20
+ drag.on(e.firstChild, e);
21
+ resize.on(e);
22
+ return e;
23
+ }
@@ -0,0 +1,17 @@
1
+ & {
2
+ width: 420px;
3
+
4
+ }
5
+
6
+ >[body] {
7
+ >.options>.button {
8
+ z-index: 2;
9
+ margin-top: -56px;
10
+ }
11
+ >.options{
12
+ height: 0;
13
+ line-height: 0;
14
+ }
15
+
16
+ overflow: visible;
17
+ }
@@ -0,0 +1,21 @@
1
+ function main(types, elem) {
2
+ var { field, data, readonly } = elem;
3
+ elem.innerHTML = `<span -text="text()"></span>` + (readonly ? "" : '<a @click="edit()">修改</a>');
4
+ renderWithDefaults(elem.children, {
5
+ text() {
6
+ if (data[field.key]) return data[field.key].map(k => `${k.name} ${isEmpty(k.key) ? "" : `(${k.key})`}`).join(", ");
7
+ return '';
8
+ },
9
+ edit() {
10
+ var editer = frame$design(data[field.key], types);
11
+ css(editer, { position: 'absolute' });
12
+ popup(editer);
13
+ move.bindPosition(editer, [.5, .5]);
14
+ on("changed")(editer, function () {
15
+ console.log(this.value, field)
16
+ data[field.key] = this.value;
17
+ });
18
+ }
19
+ })
20
+ return elem;
21
+ };
@@ -10,7 +10,7 @@ function main(title, { submit }, { data: origin, fields, }) {
10
10
  renderWithDefaults(page, {
11
11
  fields,
12
12
  title,
13
- origin: item,
13
+ origin,
14
14
  data: item,
15
15
  remove() {
16
16
  remove(page);
@@ -49,7 +49,7 @@ function main(title, { fields, options: options0, load, remove }, edit_ref) {
49
49
  load() {
50
50
  this.data = load();
51
51
  },
52
- fields: fields.concat({
52
+ fields: fields.filter(f => !f.hidden && f.inlist !== false).concat({
53
53
  name: "操作",
54
54
  options
55
55
  }),
@@ -162,6 +162,7 @@
162
162
  }
163
163
  };
164
164
  result.load = function (menu) {
165
+ data.abortAll();
165
166
  zimoli.go(menu);
166
167
  return result;
167
168
  };
@@ -3,6 +3,6 @@
3
3
  <div class="song" ng-model=song.songMarked></div>
4
4
  <div class="singer" ng-model=song.singerMarked></div>
5
5
  <div class="filterTime(song.timeLength)"></div>
6
- <div class="play-state" ng-if="song.hash===musicList.active_hash" ng-class={error:playState.error}>
6
+ <div refresh class="play-state" ng-if="song.hash===musicList.active_hash" ng-class={error:playState.error}>
7
7
  <div ng-style="{width:playState.width}"></div>
8
8
  </div>
@@ -1,5 +1,6 @@
1
1
  function main(elem) {
2
2
  elem = elem || document.createElement("song");
3
+ elem.renderid = 9;
3
4
  var $scope = {
4
5
  filterTime,
5
6
  png: img,
@@ -23,7 +24,7 @@ function main(elem) {
23
24
  songMarked: mark(songName, elem.mark),
24
25
  singerMarked: mark(singerName, elem.mark)
25
26
  };
26
- render(elem.children, $scope);
27
+ render(elem.children, $scope, 0);
27
28
  });
28
29
  return block(elem);
29
30
  }
@@ -1,10 +1,10 @@
1
- function main(title, type, params) {
1
+ function main(title, type, params, idkey = params.fields[0].key) {
2
2
  return frame$edit(title, {
3
3
  submit(a, fields) {
4
4
  a = submit(fields, a);
5
- return data.from("edit", {
5
+ return data.from(params.data ? "edit" : "add", {
6
6
  type,
7
- key: encode62.timeencode(a.key),
7
+ key: encode62.timeencode(a[idkey]),
8
8
  value: encode62.timeencode(JSON.stringify(a)),
9
9
  }).loading_promise;
10
10
  },
@@ -1,11 +1,11 @@
1
1
 
2
- function main(title, type, fields, edit_ref, options) {
2
+ function main(title, type, fields, edit_ref, options, idkey = fields[0].key) {
3
3
  return frame$list(title, {
4
4
  load() {
5
5
  return data.from("list", { type }, a => JSAM.parse(encode62.timedecode(a || '')));
6
6
  },
7
7
  remove(o) {
8
- return data.from("edit", { type, key: encode62.timeencode(o.key), value: encode62.timeencode("") }).loading_promise;
8
+ return data.from("edit", { type, key: encode62.timeencode(o[idkey]), value: encode62.timeencode("") }).loading_promise;
9
9
  },
10
10
  fields,
11
11
  options,
@@ -88,6 +88,7 @@ var isMaybeVisible = function (node) {
88
88
  }
89
89
  if (node.offsetParent) {
90
90
  var parent = node.offsetParent;
91
+ if (getComputedStyle(parent).overflow === 'visible') return true;
91
92
  return !(node.offsetLeft + node.offsetWidth - parent.scrollLeft <= parent.clientLeft ||
92
93
  node.offsetTop + node.offsetHeight - parent.scrollTop <= parent.clientTop ||
93
94
  node.offsetLeft - parent.scrollLeft >= (parent.clientWidth || parent.offsetWidth) ||
@@ -433,15 +433,11 @@ function LoadingArray_then(ok, oh) {
433
433
  else if (this.is_errored) oh(this.error_message);
434
434
  else ok();
435
435
  }
436
+ function LoadingArray_abort(ok, oh) {
437
+ if (this.loading) this.loading.abort();
438
+ }
436
439
 
437
440
  var privates = {
438
- loadAfterConfig(serviceId, params) {
439
- var promise = this.getApi(serviceId).then((api) => {
440
- params = this.pack(serviceId, params);
441
- return this.fromApi(api, params);
442
- });
443
- return promise;
444
- },
445
441
  pack(serviceId, params) {
446
442
  if (/\?/.test(serviceId)) {
447
443
  params = extend({}, getParamsFromUrl(serviceId), params);
@@ -565,12 +561,13 @@ var privates = {
565
561
  var promise = cachedLoadingPromise[id];
566
562
  var temp = JSON.stringify(params);
567
563
  var currentTime = +new Date;
564
+ var loading = null;
568
565
  if (!promise || currentTime - promise.time > 60 || temp !== promise.params || promise.search !== search) {
569
566
  var promise = new Promise(function (ok, oh) {
570
567
  if (headers) {
571
568
  headers = seekFromSource(headers, api.base);
572
569
  }
573
- cross(realmethod, uri, headers).send(params).done(e => {
570
+ loading = cross(realmethod, uri, headers).send(params).done(e => {
574
571
  ok(e.response || e.responseText);
575
572
  }).error(xhr => {
576
573
  try {
@@ -581,12 +578,13 @@ var privates = {
581
578
  }
582
579
  });
583
580
  });
581
+ promise.loading = loading;
584
582
  promise.search = search;
585
583
  promise.params = temp;
586
584
  promise.time = currentTime;
587
585
  cachedLoadingPromise[id] = promise;
588
586
  }
589
- return promise.then(function (response) {
587
+ var p = promise.then(function (response) {
590
588
  if (/\*$/.test(coinmethod)) return response;
591
589
  var data = parseData(response);
592
590
  var checked = error_check(data);
@@ -598,6 +596,8 @@ var privates = {
598
596
  }
599
597
  return data;
600
598
  });
599
+ p.loading = loading;
600
+ return p;
601
601
  },
602
602
 
603
603
  getConfigPromise() {
@@ -659,6 +659,7 @@ var data = {
659
659
  response.is_loaded = true;
660
660
  response.is_loading = false;
661
661
  if (response.then === LoadingArray_then) delete response.then;
662
+ if (response.abort === LoadingArray_abort) delete response.abort;
662
663
  }
663
664
  },
664
665
  responseCrash,
@@ -667,6 +668,7 @@ var data = {
667
668
  response.is_loaded = false;
668
669
  response.is_loading = true;
669
670
  response.then = LoadingArray_then;
671
+ response.abort = LoadingArray_abort;
670
672
  }
671
673
  },
672
674
  setReporter(report, checker) {
@@ -758,7 +760,10 @@ var data = {
758
760
  var response = this.getInstance(id || url);
759
761
  if (!isObject(response)) response = new LoadingArray;
760
762
  this.responseLoading(response);
761
- var p = response.loading_promise = privates.fromApi(api, params).then((data) => {
763
+ var p = privates.fromApi(api, params);
764
+ response.loading = p.loading;
765
+ p = response.loading_promise = p.then((data) => {
766
+ response.loading = null;
762
767
  if (id) {
763
768
  data = parse(data);
764
769
  this.setInstance(id, data, false);
@@ -781,7 +786,10 @@ var data = {
781
786
  var response = this.getInstance(id || url);
782
787
  if (!isObject(response)) response = new LoadingArray;
783
788
  this.responseLoading(response);
784
- var p = response.loading_promise = privates.loadIgnoreConfig('get', url).then((data) => {
789
+ var p = privates.loadIgnoreConfig('get', url);
790
+ response.loading = p.loading;
791
+ p = response.loading_promise = p.then((data) => {
792
+ response.loading = null;
785
793
  if (id) {
786
794
  data = parse(data);
787
795
  this.setInstance(id, data, false);
@@ -806,7 +814,13 @@ var data = {
806
814
  var response = this.getInstance(id || sid);
807
815
  if (!isObject(response)) response = new LoadingArray;
808
816
  this.responseLoading(response);
809
- var p = response.loading_promise = privates.loadAfterConfig(sid, params).then((data) => {
817
+ var p = response.loading_promise = privates.getApi(sid).then((api) => {
818
+ params = privates.pack(sid, params);
819
+ var p = privates.fromApi(api, params);
820
+ response.loading = p.loading;
821
+ return p;
822
+ }).then((data) => {
823
+ response.loading = null;
810
824
  if (id) {
811
825
  data = parse instanceof Function ? parse(data) : data;
812
826
  this.setInstance(id, data, false);
@@ -5,12 +5,13 @@
5
5
  <padding>
6
6
  <div class="field-item">
7
7
  <span class="index" ng-bind='field.id'></span>
8
- <input @focus="focus(this.parentNode)" @blur="blur(this.parentNode)" placeholder="请输入字段名称"
8
+ <input @focus="focus(this.parentNode)" @blur="blur(this.parentNode)" placeholder="显示名称"
9
9
  ng-model=field.name />
10
- <select @focus="focus(this.parentNode)" @blur="blur(this.parentNode)" aria-placeholder=""
11
- ng-model=field.type>
10
+ <input @focus="focus(this.parentNode)" @blur="blur(this.parentNode)" placeholder="键名" ng-model=field.key />
11
+ <select @focus="focus(this.parentNode)" -model="field.type" @blur="blur(this.parentNode)"
12
+ ng-model=field.type >
12
13
  <option value="">请选择字段类型</option>
13
- <option ng-repeat="type in types"></option>
14
+ <option _value="type.key" ng-repeat="type in types" -text="type.name"></option>
14
15
  </select>
15
16
  <btn ng-click=remove(field)>移除</btn>
16
17
  </div>
@@ -10,12 +10,12 @@
10
10
  >.options {
11
11
  text-align: right;
12
12
  padding: 0 16px;
13
- width: 392px;
13
+ width: 412px;
14
14
  }
15
15
 
16
16
  .padding {
17
17
  display: block;
18
- padding: 8px 10px 0;
18
+ padding: 8px 0 0;
19
19
  }
20
20
 
21
21
  .field-item {
@@ -37,7 +37,7 @@
37
37
  border-radius: 3px;
38
38
  text-align: right;
39
39
  display: block;
40
- width: 360px;
40
+ width: 390px;
41
41
  max-width: 100%;
42
42
  position: relative;
43
43
  border: 1px solid #0006;
@@ -70,6 +70,11 @@
70
70
  >input {
71
71
  border-radius: 3px 0 0 3px;
72
72
  padding-left: 6px;
73
+ width: 130px;
74
+ }
75
+
76
+ >select {
77
+ width: 80px;
73
78
  }
74
79
 
75
80
  >btn {
@@ -33,7 +33,7 @@ var setZIndex = function () {
33
33
  }
34
34
  };
35
35
  function drag(target, initialEvent, preventOverflow, isMovingSource) {
36
- if (/^(?:select|input|textarea)$/i.test(initialEvent.target.tagName)) return;
36
+ if (/^(?:select|input|textarea)$/i.test(initialEvent.target.tagName) || getTargetIn(a => a.nodrag || a.hasAttribute('nodrag') || a.dragable === false, initialEvent.target)) return;
37
37
  if (target.dragable === false) return;
38
38
  initialEvent.preventDefault();
39
39
  if (isArray(target)) {
@@ -1,4 +1,4 @@
1
- <template v-if='field?.key'>
1
+ <template v-if='field?.name'>
2
2
  <div class="head">
3
3
  <span ng-bind=field.name></span>
4
4
  <span class="required" ng-if="field.required">*</span>
@@ -379,12 +379,12 @@ function ylist(container, generator, $Y) {
379
379
  if (deltay >= delta) {
380
380
  return false;
381
381
  }
382
- if (deltay < 1) y = target_y;
383
- else if (deltay > count || deltay > 3) {
384
- y = last_y + Math.max(2 * (target_y > last_y ? .8 : -.8));
385
- }
382
+ if (deltay < 2) y = target_y;
386
383
  else {
387
- y = (target_y + last_y) / 2;
384
+ var speed = Math.abs(spd.read()[0]);
385
+ if (speed < 1) speed = 1;
386
+ if (deltay < 3) speed = .5;
387
+ y = last_y + (target_y > last_y ? speed : -speed);
388
388
  }
389
389
  list.Top(y);
390
390
  if (target_y === y) {
@@ -212,9 +212,9 @@ function main(elem) {
212
212
  if (create) {
213
213
  var e = create(elem, data, field_ref);
214
214
  if (isNode(e)) {
215
- appendChild(elem, e);
215
+ if (e !== elem) appendChild(elem, e);
216
216
  }
217
- else {
217
+ else if (!isEmpty(e)) {
218
218
  elem.innerHTML = e;
219
219
  }
220
220
  return;
@@ -222,6 +222,7 @@ function main(elem) {
222
222
  elem.innerHTML = '<span ng-bind=get()></span>';
223
223
  render(elem, {
224
224
  get() {
225
+ if (!field.key) return;
225
226
  var value = seek(data, field.key);
226
227
  if (field.options) {
227
228
  if (!field.optionsMap) {
@@ -243,7 +244,7 @@ function main(elem) {
243
244
  }
244
245
  } else {
245
246
  var create = field_type === "function" ? field_editor : constructors[field_type];
246
- var ipt = create ? create(elem, field_ref) : input();
247
+ var ipt = create ? create(elem, field_ref) : field.key ? input() : null;
247
248
 
248
249
  if (ipt) {
249
250
  if (ipt !== elem) appendChild(elem, ipt);
@@ -10,7 +10,7 @@ presets.template = function (t) {
10
10
  node.innerHTML = t.innerHTML;
11
11
  comment.with = [].slice.call(node.childNodes, 0);
12
12
  appendChild.after(comment, comment.with);
13
- renderElement(comment.with, comment.$scope, comment.$parentScopes);
13
+ renderElement(comment.with, comment.$scope, comment.$parentScopes, this.renderid === 9);
14
14
  });
15
15
  return comment;
16
16
  };
@@ -20,8 +20,11 @@ var renderidClosed = 0;
20
20
  var addRenderElement = function () {
21
21
  var element = this;
22
22
  if (!isNode(element)) return;
23
- if (element.renderid < 10 && element.renderid > 0) element.renderid = ++renderidOffset;
24
- renderElements[element.renderid] = element;
23
+ if (element.renderid !== 9) {
24
+ // 只渲染一次
25
+ if (element.renderid < 10 && element.renderid > 0) element.renderid = ++renderidOffset;
26
+ renderElements[element.renderid] = element;
27
+ }
25
28
  rebuild(element);
26
29
  };
27
30
  var removeRenderElement = function () {
@@ -78,12 +81,19 @@ var createGetter = function (search, isprop = true) {
78
81
  var initialComment = function (renders, type, expression) {
79
82
  var comment = document.createComment(`${type} ${expression}`);
80
83
  comment.renders = renders;
81
- comment.renderid = ++renderidOffset;
82
- onappend(comment, addRenderElement);
83
- onremove(comment, removeRenderElement);
84
84
  appendChild.after(this, comment);
85
85
  if (!/if/i.test(type)) remove(this);
86
- rebuild(comment);
86
+ if (!this.$struct.once) {
87
+ comment.renderid = ++renderidOffset;
88
+ onmounted(comment, addRenderElement);
89
+ onremove(comment, removeRenderElement);
90
+ if (isMounted(comment) || eagermount) rebuild(comment);
91
+ }
92
+ else {
93
+ comment.renderid = 9;
94
+ rebuild(comment);
95
+ remove(comment);
96
+ }
87
97
  return comment;
88
98
  };
89
99
  var parseRepeat = function (expression) {
@@ -442,7 +452,7 @@ var directives = {
442
452
  } else if (/^(select|input|textarea)$/i.test(this.tagName) || "value" in this) {
443
453
  this.renders.push(setter || function () {
444
454
  var value = getter();
445
- if (value === undefined) value = "";
455
+ if (isEmpty(value)) value = "";
446
456
  if (deepEqual(oldValue, value)) return;
447
457
  oldValue = value;
448
458
  if (this.value !== value) this.value = value;
@@ -599,17 +609,17 @@ function getFromScopes(key, scope, parentScopes) {
599
609
  }
600
610
  }
601
611
 
602
- function renderElement(element, scope = element.$scope, parentScopes = element.$parentScopes, eager) {
612
+ function renderElement(element, scope = element.$scope, parentScopes = element.$parentScopes, once) {
603
613
  if (!isNode(element) && element.length) {
604
614
  return [].concat.apply([], element).map(function (element) {
605
- return renderElement(element, scope, parentScopes);
615
+ return renderElement(element, scope, parentScopes, once);
606
616
  });
607
617
  }
608
618
  if (!isElement(element)) {
609
619
  return element;
610
620
  }
611
621
  if (!isNumber(element.renderid)) {
612
- renderStructure(element, scope, parentScopes);
622
+ renderStructure(element, scope, parentScopes, once);
613
623
  }
614
624
  var elementid = element.getAttribute("renderid") || element.getAttribute("elementid") || element.getAttribute("id");
615
625
  if (elementid) {
@@ -631,7 +641,8 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
631
641
  if (parentNode.renderid > 1 || isMounted(parentNode)) element.renderid = 2;
632
642
  }
633
643
  element.renders = element.renders ? [].concat(element.renders) : [];
634
- var { ons, copys, attrs, props, binds, context: withContext, ids } = element.$struct;
644
+ var { ons, copys, attrs, props, binds, context: withContext, ids, once } = element.$struct;
645
+ if (once) element.renderid = 9;
635
646
  delete element.$struct;
636
647
  if (binds.src) {
637
648
  element.$src = parseRepeat(binds.src);
@@ -679,7 +690,7 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
679
690
  }
680
691
  }
681
692
  }
682
- if (element.children && element.children.length) renderElement(element.children, scope, parentScopes);
693
+ if (element.children && element.children.length) renderElement(element.children, scope, parentScopes, once);
683
694
  if (!isFirstRender) return element;
684
695
  for (var k in binds) {
685
696
  if (directives.hasOwnProperty(k)) {
@@ -699,10 +710,15 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
699
710
  }
700
711
  ons.forEach(([on, key, value]) => on.call(element, key, [withContext, value]));
701
712
  if (element.renders.length) {
702
- onmounted(element, addRenderElement);
703
- onremove(element, removeRenderElement);
704
- if (isMounted(element) || element.renderid > 1) addRenderElement.call(element);
705
- else if (eagermount) rebuild(element);
713
+ if (element.renderid !== 9) {
714
+ onmounted(element, addRenderElement);
715
+ onremove(element, removeRenderElement);
716
+ if (isMounted(element) || element.renderid > 1) addRenderElement.call(element);
717
+ else if (eagermount) rebuild(element);
718
+ }
719
+ else {
720
+ rebuild(element);
721
+ }
706
722
  }
707
723
  if (elementid) scope[elementid] = element;
708
724
  for (var id of ids) {
@@ -710,7 +726,7 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
710
726
  }
711
727
  return element;
712
728
  }
713
- function renderStructure(element, scope, parentScopes = []) {
729
+ function renderStructure(element, scope, parentScopes = [], once) {
714
730
  // 处理结构流
715
731
  if (parentScopes !== null && !isArray(parentScopes)) {
716
732
  throw new Error('父级作用域链应以数组的类型传入');
@@ -791,25 +807,33 @@ function renderStructure(element, scope, parentScopes = []) {
791
807
  if (!/\-/.test(name) || value === '') {
792
808
  copys.push(attr);
793
809
  }
794
- props[name.replace(/\-(\w)/g, (_, w) => w.toUpperCase())] = value === "" ? true : value;
810
+ var k = name.replace(/\-(\w)/g, (_, w) => w.toUpperCase());
811
+ if (!(k in element)) {
812
+ props[k] = value === "" ? true : value;
813
+ }
814
+ else {
815
+ props[k] = element[k];
816
+ }
795
817
  }
796
818
  }
797
- if (!element.$struct) element.$struct = { ons, copys, binds, attrs: attr1, props, context: withContext, ids };
819
+ if (props["zimoli"] || props["fresh"] || props["once"]) once = true;
820
+ else if (props["refresh"] || props["digest"] || props["mount"]) once = false;
821
+ if (!element.$struct) element.$struct = { ons, copys, binds, attrs: attr1, props, context: withContext, ids, once };
798
822
  if (element.renderid <= -1) createStructure.call(element, types.if, types.repeat, withContext);
799
823
  }
800
824
  var eagermount = false, renderlock = false;
801
825
  function render(element, scope, parentScopes, lazy = true) {
802
826
  var if_top_length = if_top.length;
803
827
  var haslock = false;
828
+ if (isFinite(scope) && arguments.length === 2) lazy = scope, scope = undefined;
829
+ else if (isFinite(parentScopes) && arguments.length === 3) lazy = parentScopes, parentScopes = undefined;
830
+ var renderonce = lazy === 0;
804
831
  if (!renderlock) {
805
832
  haslock = true;
806
833
  renderlock = true;
807
- if (isBoolean(scope) && arguments.length === 2) lazy = +scope, scope = undefined;
808
- else if (isBoolean(parentScopes) && arguments.length === 3) lazy = +parentScopes, parentScopes = undefined;
809
- else lazy = +lazy;
810
- eagermount = !lazy;
834
+ eagermount = !+lazy;
811
835
  }
812
- var e = renderElement(element, scope, parentScopes);
836
+ var e = renderElement(element, scope, parentScopes, renderonce);
813
837
  if (haslock) {
814
838
  renderlock = false;
815
839
  eagermount = false;
@@ -84,7 +84,7 @@ function ybox(generator) {
84
84
  var stop = _box.stopY;
85
85
  var stop2 = lazy(function () {
86
86
  scrollY.smooth(stop);
87
- }, 60);
87
+ }, 40);
88
88
  var decrease = function () {
89
89
  var res = _decrease(increaser_t) + _decrease(increaser_b);
90
90
  if (!res) {
@@ -128,7 +128,7 @@ function ybox(generator) {
128
128
  } else {
129
129
  var wheelTime = 0;
130
130
  onmousewheel(_box, function (event) {
131
- if (event.timeStamp - wheelTime > 60 && Math.abs(event.deltaY) < 12) {
131
+ if (event.timeStamp - wheelTime > 40 && Math.abs(event.deltaY) < 12) {
132
132
  wheelTime = event.timeStamp;
133
133
  return;
134
134
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "3.17.2",
3
+ "version": "3.18.0",
4
4
  "description": "一个开发工具,开放源代码,自带组件库和编译环境,可以用来开发web组件,web应用或nodejs模块,或做为已有代码的加密工具,也可以做为静态页面服务器或跨域中转服务器使用",
5
5
  "main": "public/efront.js",
6
6
  "directories": {