|
1 | 1 | <element name="g-component">
|
2 | 2 | <script>
|
3 | 3 |
|
4 |
| - // FOUC prevent (to opt-in set opacity: 0 on body) |
| 4 | + // FOUC prevent (to opt-in, set opacity: 0 on body) |
5 | 5 |
|
6 | 6 | window.addEventListener('WebComponentsReady', function() {
|
7 | 7 | document.body.style.webkitTransition = "opacity 0.4s";
|
|
74 | 74 | function rootCreated(inRoot) {
|
75 | 75 | // set shadow-root model
|
76 | 76 | inRoot.model = this.$protected;
|
77 |
| - // parse and apply model binding markup in DOM |
78 |
| - bindModel.call(this, localChildNodes(inRoot)); |
79 | 77 | // map id's to nodes, for nodes with id's
|
80 | 78 | marshalNodeReferences.call(this.$protected, inRoot);
|
| 79 | + // parse and apply model binding markup in DOM |
| 80 | + bindModel.call(this, localChildNodes(inRoot)); |
81 | 81 | // accumulate events of interest
|
82 | 82 | // TODO(sjmiles): ideally on native we set up listeners directly on inRoot,
|
83 | 83 | // under shim inRoot does not participate in event bubbling
|
|
96 | 96 | takeAttributes.call(this.$protected);
|
97 | 97 | // call ready hook
|
98 | 98 | this.$protected.ready();
|
99 |
| - // force dirty check |
100 |
| - Model.dirtyCheck(); |
| 99 | + // TODO(sjmiles): explain succinctly why this dirtyCheck is here |
| 100 | + window.dirtyCheck(); |
101 | 101 | log.ready && console.log('[%s#%s] ready', this.localName, this.id || '');
|
102 | 102 | };
|
103 | 103 |
|
|
302 | 302 | },
|
303 | 303 | propertySetChanged: function(inChange, inWatched) {
|
304 | 304 | if (inChange.mutation == 'add') {
|
305 |
| - log.data && console.log('[%s] propertySetChanged: adding watch for [%s]', this.node.localName, inChange.propertyName); |
| 305 | + //log.watch && console.log('[%s] propertySetChanged: adding watch for [%s]', this.node.localName, inChange.propertyName); |
306 | 306 | api.addWatch.call(this, inChange.propertyName, inWatched);
|
307 |
| - this.propertyChanged(inChange.propertyName); |
| 307 | + //this.propertyChanged(inChange.propertyName); |
308 | 308 | }
|
309 | 309 | },
|
310 | 310 | watchable: function(inName, inWatched) {
|
|
317 | 317 | },
|
318 | 318 | addWatch: function(inName, inWatched) {
|
319 | 319 | if (api.watchable.call(this, inName, inWatched)) {
|
320 |
| - log.data && console.log('[' + this.node.localName + '] watching [' + inName + ']'); |
| 320 | + log.watch && console.log('[' + this.node.localName + '] watching [' + inName + ']'); |
321 | 321 | inWatched[inName] = true;
|
322 | 322 | Model.observe(this, inName, function(inNew, inOld) {
|
| 323 | + log.data && console.log('[%s#%s] watch: [%s] now [%s] was [%s]', this.node.localName, this.node.id || '', inName, this[inName], inOld); |
323 | 324 | this.propertyChanged(inName, inOld);
|
324 | 325 | }.bind(this));
|
325 | 326 | }
|
|
333 | 334 |
|
334 | 335 | Observable.prototype = {
|
335 | 336 | propertyChanged: function(inName, inOldValue) {
|
336 |
| - log.data && console.log('[%s#%s] propertyChanged: [%s] now [%s] was [%s]', this.node.localName, this.node.id || '', inName, this[inName], inOldValue); |
| 337 | + //log.data && console.log('[%s#%s] propertyChanged: [%s] now [%s] was [%s]', this.node.localName, this.node.id || '', inName, this[inName], inOldValue); |
337 | 338 | var fn = inName + 'Changed';
|
338 | 339 | if (this[fn] && !Observable._squelch) {
|
339 | 340 | this[fn](inOldValue);
|
|
533 | 534 | // nested template and functions asynchronously
|
534 | 535 |
|
535 | 536 | function bindModel(inNodes) {
|
536 |
| - log.data && console.group("[%s] bindModel", this.localName); |
| 537 | + log.bind && console.group("[%s] bindModel", this.localName); |
537 | 538 | _bindModel.call(this, inNodes);
|
538 |
| - log.data && console.groupEnd(); |
| 539 | + log.bind && console.groupEnd(); |
539 | 540 | };
|
540 | 541 |
|
541 | 542 | function _bindModel(inNodes) {
|
|
575 | 576 | } else {
|
576 | 577 | if ((inValue || inName).search(bindMustache.pattern) >= 0) {
|
577 | 578 | inNode.addBinding(inName, inValue);
|
578 |
| - log.data && console.log('[%s] bindMustache: [%s] to [%s]%s', |
| 579 | + log.bind && console.log('[%s] bindMustache: [%s] to [%s]%s', |
579 | 580 | this.localName, inValue || inName, (inNode.localName || '#text'),
|
580 | 581 | inValue ? '.[' + inValue + ']' : '');
|
581 | 582 | }
|
|
587 | 588 | // property binding extensions to MDV
|
588 | 589 |
|
589 | 590 | function bindProperties(inA, inPropA, inB, inPropB) {
|
590 |
| - log.data && console.log('[%s] bindProperties [%s] to [%s].[%s]', inA.localName, inPropA, inB.localName, inPropB); |
| 591 | + log.bind && console.log('[%s] bindProperties [%s] to [%s].[%s]', inA.localName, inPropA, inB.localName, inPropB); |
591 | 592 | _bindProperties(inA.$protected, inPropA, inB.$protected, inPropB);
|
| 593 | + // TODO(sjmiles): explain succinctly why this dirtyCheck is here |
| 594 | + window.dirtyCheck(); |
592 | 595 | };
|
593 | 596 |
|
594 | 597 | function _getProp(parts, create, context) {
|
|
610 | 613 | function getProperty(name, create, context) {
|
611 | 614 | return _getProp(name.split("."), create, context);
|
612 | 615 | };
|
613 |
| - |
614 |
| - |
| 616 | + |
615 | 617 | function _bindProperties(inA, inPropA, inB, inPropB) {
|
616 |
| - setProperty(inPropB, getProperty(inPropA, false, inA), inB); |
| 618 | + var value = getProperty(inPropA, true, inA); |
| 619 | + log.data && console.log('[%s] _bindProperties: sending [%s] (%s) to [%s].[%s]', inA.node.localName, inPropA, value, inB.node.localName, inPropB); |
| 620 | + setProperty(inPropB, value, inB); |
| 621 | + bindProperty(inA, inPropA, inB, inPropB); |
| 622 | + bindProperty(inB, inPropB, inA, inPropA); |
| 623 | + }; |
| 624 | + |
| 625 | + function bindProperty(inA, inPropA, inB, inPropB) { |
617 | 626 | Model.observe(inA, inPropA, function(inNew) {
|
618 | 627 | // intermediate changes are observed, but are irrelevant
|
619 | 628 | // we only propagate when the value stabilizes
|
620 | 629 | if (getProperty(inPropA, false, inA) === inNew) {
|
621 |
| - log.data && console.log('_bindProperties: propagating', inA.node.localName, inPropA, '(' + inNew + ')', 'to', inB.node.localName, inPropB); |
622 |
| - setProperty(inPropB, inNew, inB); |
623 |
| - } |
624 |
| - }); |
625 |
| - Model.observe(inB, inPropB, function(inNew) { |
626 |
| - // intermediate changes are observed, but are irrelevant |
627 |
| - // we only propagate when the value stabilizes |
628 |
| - if (getProperty(inPropB, false, inB) === inNew) { |
629 |
| - log.data && console.log('_bindProperties: propagating', inB.node.localName, inPropB, '(' + inNew + ')', 'to', inA.node.localName, inPropA); |
630 |
| - setProperty(inPropA, inNew, inA); |
| 630 | + // probably redundant, but prevent circularity right here |
| 631 | + if (getProperty(inPropB, false, inB) !== inNew) { |
| 632 | + log.data && console.log('[%s] bindProperty: propagating [%s] (%s) to [%s].[%s]', inA.node.localName, inPropA, inNew, inB.node.localName, inPropB); |
| 633 | + setProperty(inPropB, inNew, inB); |
| 634 | + } |
631 | 635 | }
|
632 | 636 | });
|
633 | 637 | };
|
634 |
| - |
| 638 | + |
635 | 639 | //
|
636 | 640 | // attribute processing
|
637 | 641 | //
|
|
0 commit comments