| OLD | NEW |
| 1 <!-- | 1 <!-- |
| 2 // Copyright 2014 The Chromium Authors. All rights reserved. | 2 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
| 4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
| 5 --> | 5 --> |
| 6 <import src="observe.sky" as="observe" /> | 6 <import src="observe.sky" as="observe" /> |
| 7 | 7 |
| 8 <script> | 8 <script> |
| 9 Node.prototype.bind = function(name, observable, oneTime) { | 9 Node.prototype.bind = function(name, observable, oneTime) { |
| 10 var self = this; | 10 var self = this; |
| 11 | 11 |
| 12 if (oneTime) { | 12 if (oneTime) { |
| 13 this[name] = observable; | 13 this[name] = observable; |
| 14 return; | 14 return; |
| 15 } | 15 } |
| 16 | 16 |
| 17 observable.open(function(value) { | 17 this[name] = observable.open(function(value) { |
| 18 self[name] = value; | 18 self[name] = value; |
| 19 }); | 19 }); |
| 20 | 20 |
| 21 return observable; | 21 return observable; |
| 22 }; | 22 }; |
| 23 | 23 |
| 24 function sanitizeValue(value) { | 24 function sanitizeValue(value) { |
| 25 return value == null ? '' : value; | 25 return value == null ? '' : value; |
| 26 } | 26 } |
| 27 | 27 |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 var iter = node.processBindingDirectives_(bindings); | 537 var iter = node.processBindingDirectives_(bindings); |
| 538 if (instanceBindings && iter) | 538 if (instanceBindings && iter) |
| 539 instanceBindings.push(iter); | 539 instanceBindings.push(iter); |
| 540 } | 540 } |
| 541 | 541 |
| 542 function parseWithDefault(el, name, prepareBindingFn) { | 542 function parseWithDefault(el, name, prepareBindingFn) { |
| 543 var v = el.getAttribute(name); | 543 var v = el.getAttribute(name); |
| 544 return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn); | 544 return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn); |
| 545 } | 545 } |
| 546 | 546 |
| 547 function addEventHandler(element, name, method) { |
| 548 element.addEventListener(name, function(event) { |
| 549 var scope = element.ownerScope; |
| 550 var host = scope.host; |
| 551 var handler = host && host[method]; |
| 552 if (handler instanceof Function) |
| 553 return handler.call(host, event); |
| 554 }); |
| 555 } |
| 556 |
| 547 function parseAttributeBindings(element, prepareBindingFn) { | 557 function parseAttributeBindings(element, prepareBindingFn) { |
| 548 var bindings = []; | 558 var bindings = []; |
| 549 var ifFound = false; | 559 var ifFound = false; |
| 550 var bindFound = false; | 560 var bindFound = false; |
| 551 var attributes = element.getAttributes(); | 561 var attributes = element.getAttributes(); |
| 552 | 562 |
| 553 for (var i = 0; i < attributes.length; i++) { | 563 for (var i = 0; i < attributes.length; i++) { |
| 554 var attr = attributes[i]; | 564 var attr = attributes[i]; |
| 555 var name = attr.name; | 565 var name = attr.name; |
| 556 var value = attr.value; | 566 var value = attr.value; |
| 557 | 567 |
| 558 if (isTemplate(element) && | 568 if (isTemplate(element) && |
| 559 (name === IF || name === BIND || name === REPEAT)) { | 569 (name === IF || name === BIND || name === REPEAT)) { |
| 560 continue; | 570 continue; |
| 561 } | 571 } |
| 562 | 572 |
| 573 if (name.startsWith('on-')) { |
| 574 if (!bindings.eventHandlers) |
| 575 bindings.eventHandlers = new Map(); |
| 576 bindings.eventHandlers.set(name.substring(3), value); |
| 577 continue; |
| 578 } |
| 579 |
| 563 var tokens = parseMustaches(value, name, element, | 580 var tokens = parseMustaches(value, name, element, |
| 564 prepareBindingFn); | 581 prepareBindingFn); |
| 565 if (!tokens) | 582 if (!tokens) |
| 566 continue; | 583 continue; |
| 567 | 584 |
| 568 bindings.push(name, tokens); | 585 bindings.push(name, tokens); |
| 569 } | 586 } |
| 570 | 587 |
| 571 if (isTemplate(element)) { | 588 if (isTemplate(element)) { |
| 572 bindings.isTemplate = true; | 589 bindings.isTemplate = true; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 instanceBindings); | 628 instanceBindings); |
| 612 } | 629 } |
| 613 | 630 |
| 614 if (bindings.isTemplate) { | 631 if (bindings.isTemplate) { |
| 615 clone.instanceRef_ = node; | 632 clone.instanceRef_ = node; |
| 616 | 633 |
| 617 if (delegate) | 634 if (delegate) |
| 618 clone.setDelegate_(delegate); | 635 clone.setDelegate_(delegate); |
| 619 } | 636 } |
| 620 | 637 |
| 638 if (bindings.eventHandlers) { |
| 639 bindings.eventHandlers.forEach(function(handler, eventName) { |
| 640 addEventHandler(clone, eventName, handler); |
| 641 }); |
| 642 } |
| 643 |
| 621 processBindings(clone, bindings, model, instanceBindings); | 644 processBindings(clone, bindings, model, instanceBindings); |
| 622 return clone; | 645 return clone; |
| 623 } | 646 } |
| 624 | 647 |
| 625 function createInstanceBindingMap(node, prepareBindingFn) { | 648 function createInstanceBindingMap(node, prepareBindingFn) { |
| 626 var map = getBindings(node, prepareBindingFn); | 649 var map = getBindings(node, prepareBindingFn); |
| 627 map.children = {}; | 650 map.children = {}; |
| 628 var index = 0; | 651 var index = 0; |
| 629 for (var child = node.firstChild; child; child = child.nextSibling) { | 652 for (var child = node.firstChild; child; child = child.nextSibling) { |
| 630 map.children[index++] = createInstanceBindingMap(child, prepareBindingFn); | 653 map.children[index++] = createInstanceBindingMap(child, prepareBindingFn); |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1004 this.closeInstanceBindings(this.instances[i]); | 1027 this.closeInstanceBindings(this.instances[i]); |
| 1005 } | 1028 } |
| 1006 | 1029 |
| 1007 this.instances.length = 0; | 1030 this.instances.length = 0; |
| 1008 this.closeDeps(); | 1031 this.closeDeps(); |
| 1009 this.templateElement_.iterator_ = undefined; | 1032 this.templateElement_.iterator_ = undefined; |
| 1010 this.closed = true; | 1033 this.closed = true; |
| 1011 } | 1034 } |
| 1012 }; | 1035 }; |
| 1013 </script> | 1036 </script> |
| OLD | NEW |