efront 3.4.7 → 3.5.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.
@@ -1,3 +1,4 @@
1
1
  ./aapi/ authorization:
2
2
  login: options /::login-:a
3
- run: options /:::run
3
+ run: options /:::run
4
+ share: options /::share
@@ -13,12 +13,12 @@ function main() {
13
13
  } catch { }
14
14
  target.removeAttribute('pending');
15
15
  },
16
- logout() {
16
+ async logout() {
17
17
  data.setSource('authorization', null);
18
- user.logout();
19
- location.reload();
18
+ await user.Logout();
19
+ zimoli.switch();
20
+ zimoli();
20
21
  }
21
22
  });
22
- console.log(page)
23
23
  return page;
24
24
  }
@@ -1,6 +1,9 @@
1
1
  data.loadConfig("api.yml");
2
2
  user.loginPath = '/auth/login';
3
- // user.token = data.getSource('authorization');
3
+ var token = data.getSource('authorization');
4
+ if (token) {
5
+ user.login({});
6
+ }
4
7
  setInterval(function () {
5
8
  var auth = data.getSource('authorization');
6
9
  if (!auth) return;
@@ -1,3 +1,5 @@
1
1
  首页: /home/welcome
2
- 工作台: /home/short
2
+ 共享目录管理: /share/list
3
+ 短链接: /home/short
4
+ # 用户: /home/short
3
5
  # 用户列表: /user/list
@@ -0,0 +1 @@
1
+ <table :src=[fields,data]></table>
@@ -0,0 +1,24 @@
1
+ var fields = refilm`
2
+ 路径/path
3
+ 操作 btn ${[{
4
+ name: "删除",
5
+ do(e) {
6
+ console.log(e)
7
+ alert("暂不支持删除!");
8
+ }
9
+ }]}
10
+ `;
11
+ console.log(fields)
12
+ function main() {
13
+ var page = div();
14
+ page.innerHTML = list;
15
+ var a = data.from("share", a => {
16
+ if (a) return a.map(b => ({ path: b }));
17
+ });
18
+ renderWithDefaults(page, {
19
+ data: a,
20
+ fields,
21
+ });
22
+ console.log(a)
23
+ return page;
24
+ }
@@ -90,14 +90,14 @@ function main(mainPath, historyName = "") {
90
90
  var hook = function () {
91
91
  if (--index !== 0) return;
92
92
  if (leftPath) {
93
- var page = zimoli.go(leftPath, null, leftLayer);
93
+ var page = zimoli.create(leftPath);
94
94
  page.setAttribute('layer', 'left');
95
95
  appendChild.replace(leftLayer, page);
96
96
  leftLayer = page;
97
97
  dragview({ page: layer, toLeft: layer.closeLeft, toRight: layer.openLeft, menu: leftLayer });
98
98
  }
99
99
  if (topPath) {
100
- var page = zimoli.go(topPath, null, topLayer);
100
+ var page = zimoli.create(topPath);
101
101
  page.setAttribute('layer', 'top');
102
102
  appendChild.replace(topLayer, page);
103
103
  topLayer = page;
@@ -8,6 +8,7 @@ styles.success = styles.pass = styles.green;
8
8
  styles.info = styles.blue;
9
9
  styles.error = styles.danger = styles.red;
10
10
  styles.warn = styles.orange;
11
+ styles.default = '#000';
11
12
  var alerts = [];
12
13
  var clean = Cleanup(alerts);
13
14
  var build = function () {
@@ -21,15 +22,15 @@ var build = function () {
21
22
  };
22
23
  var fontSize = 16;
23
24
  var singleHeight = fontSize * 3.125 | 0;
24
- var _text = function (color, parameters) {
25
+ var _text = function (bgcolor, parameters) {
25
26
  var box = div();
26
27
  css(box, `top:${fromPixel(alerts.length ? Math.max.apply(Math, alerts.map(e => e.offsetTop + e.children[0].offsetHeight)) : 0)};height:0;line-height:${fromPixel(singleHeight - 20)};left:0;right:0;font-size:${fromPixel(fontSize)}; transition: all 0.2s ease-out;position:absolute;color:#fff;text-align:center;`);
27
- box.innerHTML = `<div style='width: 720px;white-space:pre-wrap;max-width:100%;display:inline-block;height:auto;padding:${fromPixel(10)} ${fromPixel(20)};background-color:${color};'>${[].slice.call(parameters, 0).join(", ")}</div>`;
28
+ box.innerHTML = `<div style='width: 720px;white-space:pre-wrap;max-width:100%;display:inline-block;height:auto;padding:${fromPixel(10)} ${fromPixel(20)};background-color:${bgcolor};color:${color.pair(bgcolor)};'>${[].slice.call(parameters, 0).join(", ")}</div>`;
28
29
  box.initialStyle = `margin:-${fromPixel(singleHeight)} auto;opacity:0;`;
29
30
  return box;
30
31
  };
31
32
  function alert() {
32
- var color = String(this), text, autoclose = true, onclose;
33
+ var color = String(isString(this) && this || styles.default), text, autoclose = true, onclose;
33
34
  var color_reg = /^#(?:\w{6}|\w{3})$/;
34
35
  [].map.call(arguments, function (arg) {
35
36
  switch (typeof arg) {
@@ -116,6 +116,7 @@ appendChild.insert = function (parent, element, relative = parent.childNodes[0]
116
116
  }
117
117
  };
118
118
  appendChild.replace = function (alreadyMounted, element) {
119
+ if (alreadyMounted === element) return;
119
120
  if (!alreadyMounted || !alreadyMounted.parentNode) return;
120
121
  insertBefore(alreadyMounted, element);
121
122
  remove(alreadyMounted);
@@ -37,6 +37,7 @@ var trim3v = function (r, g, b) {
37
37
  if (b > 0) b += rest;
38
38
  }
39
39
  } while (rest > 0);
40
+
40
41
  return [r, g, b];
41
42
  }
42
43
 
@@ -56,7 +57,7 @@ var rgb4s = function (r, g, b, s) {
56
57
  g -= m;
57
58
  b -= m;
58
59
  }
59
- s = s * 255 / Math.max(r, g, b);
60
+ s = s * 255 / (Math.max(r, g, b) || 1);
60
61
  if (s) {
61
62
  r *= s;
62
63
  g *= s;
@@ -276,7 +277,7 @@ var rgb2v = function (r, g, b) {
276
277
  r *= .299;
277
278
  g *= .587;
278
279
  b *= .114;
279
- return r + g + b;
280
+ return Math.max(r, g, b) / .587;
280
281
  };
281
282
  var v2rgb = function (v, r, g, b) {
282
283
  var t = r + g + b || 1;
@@ -121,18 +121,8 @@ function main() {
121
121
  minWidth = arg;
122
122
  }
123
123
  });
124
- var src = element.getAttribute("src") || element.getAttribute("ng-src") || element.getAttribute("v-src");
125
- if (src) {
126
- var parsedSrc = render.parseRepeat(src);
127
- if (!parsedSrc) {
128
- element.setAttribute("ng-src", src);
129
- element.removeAttribute("src");
130
- var generator = getGenerator(element);
131
- } else {
132
- element.setAttribute("ng-src", parsedSrc.srcName);
133
- element.removeAttribute("src");
134
- var generator = getGenerator(element, parsedSrc);
135
- }
124
+ if ("$src" in element) {
125
+ var generator = getGenerator(element);
136
126
  care(element, function () {
137
127
  var index = element.index();
138
128
  element.clean();
@@ -1,6 +1,6 @@
1
1
 
2
2
  var _slider = createElement(div);
3
- var getGenerator = function (container, parsedSrc) {
3
+ var getGenerator = function (container) {
4
4
  if (!container) return;
5
5
  var template = document.createElement("div");
6
6
  var templates = [].concat.apply([], container.childNodes).filter(a => {
@@ -20,26 +20,27 @@ var getGenerator = function (container, parsedSrc) {
20
20
  appendChild(template, templates);
21
21
  container.insertBefore = _slider.insertBefore;
22
22
  container.appendChild = _slider.appendChild;
23
+ var scopes = container.$parentScopes.concat(container.$scope);
23
24
  return function (index, com) {
24
25
  if (!com) {
25
26
  if (!container.src || index >= container.src.length) return;
26
27
  com = container.src[index];
27
28
  }
28
29
  if (!com) return;
29
- var template1 = template.cloneNode();
30
- template1.innerHTML = template.innerHTML;
30
+ var template1 = template.cloneNode(true);
31
31
  if (!template1.childNodes.length) return template1;
32
32
  var item = template1.childNodes[0];
33
33
  item.with = [].concat.apply([], template1.childNodes).slice(1);
34
+ var parsedSrc = container.$src;
34
35
  if (parsedSrc) {
35
36
  var { keyName, itemName, indexName } = parsedSrc;
36
- var newScope = extend(Object.create(container.$scope), {
37
+ var newScope = {
37
38
  [keyName || '$key']: index,
38
39
  [itemName || '$item']: com,
39
40
  [indexName || '$index']: index
40
- });
41
- var newItem = render(item, newScope);
42
- newItem.with = render(item.with, newScope);
41
+ };
42
+ var newItem = render(item, newScope, scopes);
43
+ if (item.with.length) newItem.with = render(item.with, newScope, scopes);
43
44
  } else {
44
45
  var newScope = container.src[index];
45
46
  if (!isObject(newScope)) newScope = {
@@ -59,8 +60,8 @@ var getGenerator = function (container, parsedSrc) {
59
60
  return this.$item;
60
61
  }
61
62
  }
62
- var newItem = render(item, newScope, [container.$scope]);
63
- newItem.with = render(newItem.with = item.with, newScope, [container.$scope]);
63
+ var newItem = render(item, newScope, scopes);
64
+ newItem.with = render(newItem.with = item.with, newScope, scopes);
64
65
  }
65
66
  return newItem;
66
67
  };
@@ -433,18 +433,8 @@ function list() {
433
433
  bindSrc = container;
434
434
  container = div();
435
435
  } else if (container && !generator) {
436
- var src = container.getAttribute("src") || container.getAttribute("ng-src") || container.getAttribute("v-src");
437
- if (src) {
438
- var parsedSrc = render.parseRepeat(src);
439
- if (!parsedSrc) {
440
- container.setAttribute("ng-src", src);
441
- container.removeAttribute("src");
442
- var generator = getGenerator(container);
443
- } else {
444
- container.setAttribute("ng-src", parsedSrc.srcName);
445
- container.removeAttribute("src");
446
- var generator = getGenerator(container, parsedSrc);
447
- }
436
+ if ("$src" in container) {
437
+ generator = getGenerator(container);
448
438
  care(container, function () {
449
439
  var index = container.index();
450
440
  container.clean();
@@ -110,18 +110,6 @@ function main(elem, mode) {
110
110
  }
111
111
  }
112
112
  mode = mode ? mode.toLowerCase() : "horizonal";
113
- var src = elem.getAttribute("src") || elem.getAttribute("ng-src") || elem.getAttribute("v-src");
114
- if (src) {
115
- var parsedSrc = render.parseRepeat(src);
116
- if (!parsedSrc) {
117
- elem.removeAttribute("src");
118
- var generator = getGenerator(elem);
119
- } else {
120
- elem.removeAttribute("src");
121
- var generator = getGenerator(elem, parsedSrc);
122
- }
123
- elem.setAttribute("ng-src", parsedSrc ? parsedSrc.srcName : src);
124
- }
125
113
 
126
114
  switch (mode) {
127
115
  case "i":
@@ -130,6 +118,7 @@ function main(elem, mode) {
130
118
  case "t":
131
119
  case "tree":
132
120
  if (elem) {
121
+ var generator = getGenerator(elem);
133
122
  tree(elem, function (index, item) {
134
123
  var e = generator(index, item);
135
124
  if (!e || e.children.length) return e;
@@ -165,9 +154,9 @@ function main(elem, mode) {
165
154
  var emit = function (item) {
166
155
  active(elem, item, item.value);
167
156
  };
168
- if (src) {
157
+ if ("$src" in elem) {
169
158
  care(elem, function (src) {
170
- menuList(elem, getTreeFromData(src), emit, generator, direction);
159
+ menuList(elem, getTreeFromData(src), emit, direction);
171
160
  });
172
161
  } else {
173
162
  var nodes = getArrayNodes(elem);
@@ -8,7 +8,7 @@ var release = function () {
8
8
  var clear = function () {
9
9
  clearTimeout(releaseTimer);
10
10
  };
11
- function main(page, items, active, generator, direction = 'y') {
11
+ function main(page, items, active, direction = 'y') {
12
12
  if (!isNode(page)) {
13
13
  var page = div();
14
14
  }
@@ -21,7 +21,7 @@ function main(page, items, active, generator, direction = 'y') {
21
21
  if (!item.children || !item.children.length) return;
22
22
  var clone = template.cloneNode();
23
23
  clone.innerHTML = template.innerHTML;
24
- var menu = main(clone, item.children, active, generator);
24
+ var menu = main(clone, item.children, active);
25
25
  mounted_menus.push(menu);
26
26
 
27
27
  page.active = menu;
@@ -46,7 +46,7 @@ function main(page, items, active, generator, direction = 'y') {
46
46
  template.innerHTML = page.innerHTML;
47
47
  page.tempalte = template;
48
48
  }
49
- if (!generator || !page.children.length || page.menutype === 1) {
49
+ if (!page.children.length || page.menutype === 1) {
50
50
  page.innerHTML = menuList;
51
51
  page.menutype = 1;
52
52
  var hasIcon = function () {
@@ -82,6 +82,7 @@ function main(page, items, active, generator, direction = 'y') {
82
82
  this.$scope.hasIcon = hasIcon();
83
83
  });
84
84
  } else {
85
+ var generator = getGenerator(page);
85
86
  list(page, function (index) {
86
87
  var elem = generator(index);
87
88
  if (!elem) return;
@@ -144,7 +144,10 @@ var createRepeat = function (search, id = 0) {
144
144
  throw new Error("数据量过大,取消绘制!");
145
145
  }
146
146
  var $parentScopes = element.$parentScopes || [];
147
- if (element.$scope) $parentScopes = $parentScopes.concat(element.$scope);
147
+ var $struct = element.$struct;
148
+ if (element.$scope) {
149
+ $struct = Object.assign({}, $struct, { context: $struct.context + `with(this.$parentScopes[${$parentScopes.length}])` }), $parentScopes = $parentScopes.concat(element.$scope);
150
+ }
148
151
  var clonedElements1 = Object.create(null);
149
152
  var cloned = keys.map(function (key, cx) {
150
153
  var k = isArrayResult ? cx : key;
@@ -161,6 +164,7 @@ var createRepeat = function (search, id = 0) {
161
164
  };
162
165
  clone.$scope = $scope;
163
166
  clone.$parentScopes = $parentScopes;
167
+ clone.$struct = $struct;
164
168
  clone = render(clone, $scope, clone.$parentScopes);
165
169
  clonedElements1[k] = clone;
166
170
  return clone;
@@ -302,19 +306,17 @@ var parseIfWithRepeat = function (ifExpression, repeatExpression) {
302
306
 
303
307
  var createStructure = function ({ name: ifkey, key, value: ifexp } = {}, { name: forkey, value: repeat } = {}, context) {
304
308
  var element = this;
305
- if (!ifkey) return structures.repeat.call(element, [context, repeat]);
306
- if (!repeat) return structures[key].call(element, [context, ifexp]);
309
+ if (!ifkey) return element.removeAttribute(forkey), structures.repeat.call(element, [context, repeat]);
310
+ if (!repeat) return element.removeAttribute(ifkey), structures[key].call(element, [context, ifexp]);
307
311
  if (!ifexp) {
308
312
  element.removeAttribute(ifkey);
309
313
  return structures[key].call(element, [context, ifexp]);
310
314
  }
311
315
  var { before, after } = parseIfWithRepeat(ifexp, repeat);
312
- if (!after.length) {
313
- element.removeAttribute(ifkey);
314
- } else {
315
- element.setAttribute(ifkey, after.join("&&"));
316
+ element.removeAttribute(ifkey);
317
+ if (after.length) {
318
+ element.setAttribute("a-if", after.join("&&"));
316
319
  }
317
-
318
320
  if (before.length > 0) {
319
321
  // 懒渲染
320
322
  createIf.call(element, [context, before.join("&&")], null);
@@ -367,6 +369,27 @@ var createBinder = function (binder) {
367
369
 
368
370
  }
369
371
  }
372
+
373
+ var src2 = function (search) {
374
+ var getter = createGetter(search).bind(this);
375
+ var savedValue;
376
+ this.renders.push(function () {
377
+ var origin = getter();
378
+ var temp = origin;
379
+ if (origin instanceof Array) {
380
+ temp = extend([], origin);
381
+ } else if (isObject(origin)) {
382
+ temp = extend({}, origin);
383
+ } else if (isEmpty(origin)) {
384
+ temp = "";
385
+ }
386
+ var changes = getChanges(temp, savedValue);
387
+ if (!changes) return;
388
+ savedValue = temp;
389
+ this.src = origin;
390
+ cast(this, origin);
391
+ });
392
+ }
370
393
  var directives = {
371
394
  bind: createBinder(text),
372
395
  html: createBinder(html),
@@ -379,47 +402,9 @@ var directives = {
379
402
  elem.style.display = value ? '' : 'none';
380
403
  }),
381
404
  style: createBinder(css),
382
- src(search) {
383
- var getter = createGetter(search).bind(this);
384
- var savedValue, pending;
385
- var refresh = function () {
386
- that.src = savedValue;
387
- removeClass(that, "pending");
388
- pending = 0;
389
- };
390
- var img = document.createElement("img");
391
- var that = this;
392
- this.renders.push(function () {
393
- var origin = getter();
394
- var temp = origin;
395
- if (origin instanceof Array) {
396
- temp = extend([], origin);
397
- } else if (isObject(origin)) {
398
- temp = extend({}, origin);
399
- } else if (isEmpty(origin)) {
400
- temp = "";
401
- }
402
- var changes = getChanges(temp, savedValue);
403
- if (!changes) return;
404
- savedValue = temp;
405
- if (/^img$/i.test(this.tagName)) {
406
- if (!isString(origin)) {
407
- return;
408
- }
409
- if (origin) {
410
- img.src = origin;
411
- if (img.complete) {
412
- this.src = origin;
413
- } else if (!pending) {
414
- addClass(this, "pending");
415
- pending = setTimeout(refresh);
416
- }
417
- }
418
- } else {
419
- this.src = origin;
420
- cast(this, origin);
421
- }
422
- });
405
+ src([s, src]) {
406
+ var parsedSrc = this.$src;
407
+ return src2.call(this, [s, parsedSrc ? parsedSrc.srcName : src]);
423
408
  },
424
409
  model(search) {
425
410
  var getter = createGetter(search).bind(this);
@@ -510,6 +495,7 @@ var directives = {
510
495
  });
511
496
  },
512
497
  };
498
+ directives.text = directives.bind;
513
499
  // property binder
514
500
  var binders = {
515
501
  _(attr, search) {
@@ -607,10 +593,14 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
607
593
  if (parentNode) {
608
594
  if (parentNode.renderid > 1 || parentNode.isMounted) element.renderid = 2;
609
595
  }
610
- var ons = [];
611
596
 
612
597
  if (isFirstRender) {
613
- var attrs = [].concat.apply([], element.attributes);
598
+ element.renders = element.renders ? [].concat(element.renders) : [];
599
+ var { ons, copys, attrs, props, binds, context: withContext } = element.$struct;
600
+ delete element.$struct;
601
+ if (binds.src) {
602
+ element.$src = parseRepeat(binds.src);
603
+ }
614
604
  var { tagName, parentNode, nextSibling } = element;
615
605
  // 替换元素
616
606
  var constructor = getFromScopes(tagName, scope, parentScopes);
@@ -623,13 +613,12 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
623
613
  constructor = getFromScopes(tagName, scope, parentScopes);
624
614
  }
625
615
  if (isFunction(constructor)) {
626
- var attrsMap = {};
627
616
  var replacer = constructor.call(scope, element, scope, parentScopes);
628
617
  if (isNode(replacer) && element !== replacer) {
629
618
  if (nextSibling) appendChild.before(nextSibling, replacer);
630
619
  else if (parentNode) appendChild(parentNode, replacer);
631
620
  if (element.parentNode === parentNode) remove(element);
632
- attrs.map(function (attr) {
621
+ copys.forEach(function (attr) {
633
622
  var { name, value } = attr;
634
623
  switch (name.toLowerCase()) {
635
624
  case "class":
@@ -643,62 +632,39 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
643
632
  replacer[name] = value;
644
633
  break;
645
634
  default:
646
- if (!/[\-@\:\._]/.test(name)) {
647
- replacer.setAttribute(name, value);
648
- } else {
649
- attrsMap[name] = attr;
650
- }
635
+ replacer.setAttribute(name, value);
651
636
  }
652
637
  });
653
638
  replacer.renderid = element.renderid;
639
+ replacer.renders = element.renders;
640
+ if (binds.src) replacer.$src = element.$src;
654
641
  element = replacer;
655
642
  element.$scope = scope;
656
643
  element.$parentScopes = parentScopes;
657
644
  }
658
- [].concat.apply([], element.attributes).forEach(attr => {
659
- if (attrsMap[attr.name]) {
660
- delete attrsMap[attr.name];
661
- }
662
- attrsMap[attr.name] = attr;
663
- });
664
- attrs = Object.keys(attrsMap).map(key => attrsMap[key]);
665
645
  }
666
646
  }
667
647
  if (element.children.length) renderElement(element.children, scope, parentScopes);
668
648
  if (!isFirstRender) return element;
669
- // 解析属性
670
- element.renders = element.renders ? [].concat(element.renders) : [];
671
- var withContext = parentScopes ? parentScopes.map((_, cx) => `with(this.$parentScopes[${cx}])`).join("") : '';
672
- var emiter_reg = /^(?:(v|ng|on|once)\-|v\-on\:|@|once|on)/i;
673
- attrs.map(function (attr) {
674
- var { name, value } = attr;
675
- if (/^(?:class|style|src|\:)$/i.test(name)) return;
676
- var key = name.replace(/^(ng|v|.*?)\-|^[\:\_\.]/i, "").toLowerCase();
677
- if (directives.hasOwnProperty(key) && isFunction(directives[key])) {
678
- directives[key].call(element, [withContext, value]);
679
- element.removeAttribute(name);
680
- } else if (emiter_reg.test(name)) {
681
- var match = emiter_reg.exec(name);
682
- var ngon = (match[1] || match[0]).toLowerCase() === 'once' ? 'once' : 'on';
683
- element.removeAttribute(name);
684
- ons.push([emiters[ngon], name.replace(emiter_reg, ''), value]);
685
- } else if (/^([\_\:\.]|v\-bind\:)/.test(name)) {
686
- binders._.call(element, name.replace(/^([\_\:\.]|v\-bind\:)/, ""), [withContext, value]);
687
- element.removeAttribute(name);
688
- } else if (/[_@\:\.]$/.test(name)) {
689
- binders[""].call(element, name.replace(/[_@\:\.]$/, ""), [withContext, value]);
690
- element.removeAttribute(name);
691
- } else {
692
- name = name.replace(/\-(\w)/g, (_, w) => w.toUpperCase());
693
- try {
694
- element[name] = value === '' ? true : value;
695
- } catch (e) {
696
- }
649
+ for (var k in binds) {
650
+ if (directives.hasOwnProperty(k)) {
651
+ directives[k].call(element, [withContext, binds[k]])
697
652
  }
698
- });
699
- rebuild(element);
653
+ else {
654
+ binders._.call(element, k, [withContext, binds[k]]);
655
+ }
656
+ }
657
+ for (var k in attrs) {
658
+ binders[""].call(element, k, [withContext, attrs[k]]);
659
+ }
660
+ for (var k in props) {
661
+ try {
662
+ element[k] = props[k];
663
+ } catch (e) { }
664
+ }
700
665
  ons.forEach(([on, key, value]) => on.call(element, key, [withContext, value]));
701
666
  if (element.renders.length) {
667
+ rebuild(element);
702
668
  onappend(element, addRenderElement);
703
669
  onremove(element, removeRenderElement);
704
670
  if (element.isMounted || element.renderid > 1) addRenderElement.call(element);
@@ -720,11 +686,19 @@ function renderStructure(element, scope, parentScopes = []) {
720
686
  }
721
687
  var attrs = [].concat.apply([], element.attributes);
722
688
  var withContext = parentScopes ? parentScopes.map((_, cx) => `with(this.$parentScopes[${cx}])`).join("") : '';
723
- attrs = attrs.filter(a => structures.hasOwnProperty(a.name.replace(/^(ng|V|.*?)\-/i, '').toLowerCase()));
724
689
  var types = {};
725
- if (attrs.length > 2) throw new Error(`请不要在同一元素上使用三次及以上的结构属性:${attrs.map(a => a.name)}`);
726
- attrs.map(function (attr) {
727
- var { name } = attr;
690
+ var emiter_reg = /^(?:(v|ng|on|once)\-|v\-on\:|@|once|on)/i;
691
+ var ons = [];
692
+ var copys = [];
693
+ var binds = {};
694
+ var attr1 = {};
695
+ var props = {};
696
+ for (var attr of attrs) {
697
+ var { name, value } = attr;
698
+ if (/^(?:class|style|src|\:|placeholder)$/i.test(name)) {
699
+ copys.push(attr);
700
+ continue;
701
+ }
728
702
  var key = name.replace(/^(ng|v|.*?)\-/i, "").toLowerCase();
729
703
  if (structures.hasOwnProperty(key) && isFunction(structures[key])) {
730
704
  if (element.renderid <= -2) {
@@ -747,9 +721,29 @@ function renderStructure(element, scope, parentScopes = []) {
747
721
  }
748
722
  if (!element.renderid) element.renderid = -1;
749
723
  else element.renderid = -2;
724
+ // element.removeAttribute(name);
725
+ }
726
+ if (element.$struct) continue;
727
+ var key = name.replace(/^(ng|v|.*?)\-|^[\:\_\.]|^v\-bind\:/i, "").toLowerCase();
728
+ if (directives.hasOwnProperty(key) || /^([\_\:\.]|v\-bind\:)/.test(name)) {
729
+ binds[key] = value;
750
730
  element.removeAttribute(name);
751
731
  }
752
- });
732
+ else if (emiter_reg.test(name)) {
733
+ var match = emiter_reg.exec(name);
734
+ var ngon = (match[1] || match[0]).toLowerCase() === 'once' ? 'once' : 'on';
735
+ element.removeAttribute(name);
736
+ ons.push([emiters[ngon], name.replace(emiter_reg, ''), value]);
737
+ }
738
+ else if (/[_@\:\.]$/.test(name)) {
739
+ attr1[name.replace(/[_@\:\.]$/, "")] = value;
740
+ element.removeAttribute(name);
741
+ }
742
+ else {
743
+ props[name.replace(/\-(\w)/g, (_, w) => w.toUpperCase())] = value === "" ? true : value;
744
+ }
745
+ }
746
+ if (!element.$struct) element.$struct = { ons, copys, binds, attrs: attr1, props, context: withContext };
753
747
  if (element.renderid <= -1) createStructure.call(element, types.if, types.repeat, withContext);
754
748
  }
755
749
  function render(element, scope, parentScopes) {
@@ -0,0 +1,16 @@
1
+ <thead>
2
+ <tr>
3
+ <td -repeat="f in fields"><i -if="f.icon" -class="f.icon"></i></span><span -if="f.name" -html="f.name"></span>
4
+ </td>
5
+ </tr>
6
+ </thead>
7
+ <tbody -src="d in data">
8
+ <tr>
9
+ <td -repeat="f in fields">
10
+ <span -if="f.key" -text="d[f.key]"></span>
11
+ <a on-click="o.do(d)" -if="f.type==='btn'" -repeat="o in f.options">
12
+ <span -text=o.name></span>
13
+ </a>
14
+ </td>
15
+ </tr>
16
+ </tbody>
@@ -153,10 +153,24 @@ function table(elem) {
153
153
  table.dragbox = function () {
154
154
  return thead;
155
155
  };
156
+ care(table, function ([fields, data]) {
157
+ this.innerHTML = template;
158
+ render(this, {
159
+ fields,
160
+ tbody: list,
161
+ data,
162
+ a: button,
163
+ }, this.$parentScopes.concat(this.$scope));
164
+ })
156
165
  autodragchildren(
157
166
  table,
158
167
  cellMatchManager,
159
168
  function (src, dst, rel, append, parentNode) {
169
+ if (table.src) {
170
+ var [fields] = table.src;
171
+ var [f] = fields.splice(src, 1);
172
+ fields.splice(dst, 0, f);
173
+ }
160
174
  var children = parentNode.children;
161
175
  var srcElement = children[src];
162
176
  var dstElement = children[rel];