Skip to content
This repository was archived by the owner on Mar 13, 2018. It is now read-only.

Commit 6d98251

Browse files
committed
getBinding -> prepareBinding/bindingFn
R=arv BUG= Review URL: https://codereview.appspot.com/13366047
1 parent 1162259 commit 6d98251

File tree

2 files changed

+124
-96
lines changed

2 files changed

+124
-96
lines changed

src/TemplateBinding.js

Lines changed: 55 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -470,21 +470,19 @@
470470
var content = this.ref.content;
471471
var map = content.bindingMap_;
472472
if (!map) {
473+
var delegatePrepareBindingFn =
474+
delegate && typeof delegate.prepareBinding === 'function' ?
475+
delegate.prepareBinding : undefined;
473476
// TODO(rafaelw): Setup a MutationObserver on content to detect
474477
// when the instanceMap is invalid.
475-
map = createInstanceBindingMap(content) || [];
478+
map = createInstanceBindingMap(content, delegatePrepareBindingFn) || [];
476479
content.bindingMap_ = map;
477480
}
478481

479482
var instance = map.hasSubTemplate ?
480483
deepCloneIgnoreTemplateContent(content) : content.cloneNode(true);
481484

482-
var delegateGetBindingFn =
483-
delegate && typeof delegate.getBinding === 'function' ?
484-
delegate.getBinding : undefined;
485-
486-
addMapBindings(instance, map, model, delegate, delegateGetBindingFn,
487-
bound);
485+
addMapBindings(instance, map, model, delegate, bound);
488486
// TODO(rafaelw): We can do this more lazily, but setting a sentinel
489487
// in the parent of the template element, and creating it when it's
490488
// asked for by walking back to find the iterating template.
@@ -532,8 +530,8 @@
532530

533531
// Returns
534532
// a) undefined if there are no mustaches.
535-
// b) [TEXT, (PATH, TEXT)+] if there is at least one mustache.
536-
function parseMustaches(s) {
533+
// b) [TEXT, (PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.
534+
function parseMustaches(s, name, node, delegatePrepareBindingFn) {
537535
if (!s || !s.length)
538536
return;
539537

@@ -554,26 +552,30 @@
554552

555553
tokens = tokens || [];
556554
tokens.push(s.slice(lastIndex, startIndex)); // TEXT
557-
tokens.push(s.slice(startIndex + 2, endIndex).trim()); // PATH
555+
var pathString = s.slice(startIndex + 2, endIndex).trim();
556+
tokens.push(Path.get(pathString)); // PATH
557+
var delegateFn = delegatePrepareBindingFn &&
558+
delegatePrepareBindingFn(pathString, name, node)
559+
tokens.push(delegateFn); // DELEGATE_FN
558560
lastIndex = endIndex + 2;
559561
}
560562

561563
if (lastIndex === length)
562564
tokens.push(''); // TEXT
563565

564-
tokens.hasOnePath = tokens.length === 3;
566+
tokens.hasOnePath = tokens.length === 4;
565567
tokens.isSimplePath = tokens.hasOnePath &&
566568
tokens[0] == '' &&
567-
tokens[2] == '';
569+
tokens[3] == '';
568570

569571
tokens.combinator = function(values) {
570572
var newValue = tokens[0];
571573

572-
for (var i = 1; i < tokens.length; i += 2) {
573-
var value = tokens.hasOnePath ? values : values[(i-1)/ 2];
574+
for (var i = 1; i < tokens.length; i += 3) {
575+
var value = tokens.hasOnePath ? values : values[(i - 1) / 3];
574576
if (value !== undefined)
575577
newValue += value;
576-
newValue += tokens[i + 1];
578+
newValue += tokens[i + 2];
577579
}
578580

579581
return newValue;
@@ -582,28 +584,29 @@
582584
return tokens;
583585
}
584586

585-
function processBindings(bindings, node, model, delegateGetBindingFn, bound) {
587+
var valuePath = Path.get('value');
588+
589+
function processBindings(bindings, node, model, bound) {
586590
for (var i = 0; i < bindings.length; i += 2) {
587591
var name = bindings[i];
588592
var tokens = bindings[i + 1];
589593
var bindingModel = model;
590594
var bindingPath = tokens[1];
591595
if (tokens.hasOnePath) {
592-
var dm = delegateGetBindingFn && delegateGetBindingFn(bindingModel,
593-
bindingPath,
594-
name,
595-
node);
596-
if (dm !== undefined) {
597-
bindingModel = dm;
598-
bindingPath = 'value';
596+
var delegateFn = tokens[2];
597+
var delegateBinding = delegateFn && delegateFn(model, name, node);
598+
599+
if (delegateBinding !== undefined) {
600+
bindingModel = delegateBinding;
601+
bindingPath = valuePath;
599602
}
600603

601604
if (!tokens.isSimplePath) {
602605
bindingModel = new PathObserver(bindingModel, bindingPath, undefined,
603606
undefined,
604607
undefined,
605608
tokens.combinator);
606-
bindingPath = 'value';
609+
bindingPath = valuePath;
607610
}
608611
} else {
609612
var observer = new CompoundPathObserver(undefined,
@@ -612,24 +615,23 @@
612615
tokens.combinator);
613616

614617

615-
for (var i = 1; i < tokens.length; i = i + 2) {
618+
for (var i = 1; i < tokens.length; i = i + 3) {
616619
var subModel = model;
617620
var subPath = tokens[i];
618-
var dm = delegateGetBindingFn && delegateGetBindingFn(subModel,
619-
subPath,
620-
name,
621-
node);
622-
if (dm !== undefined) {
623-
subModel = dm;
624-
subPath = 'value';
621+
var delegateFn = tokens[i + 1];
622+
var delegateBinding = delegateFn && delegateFn(subModel, name, node);
623+
624+
if (delegateBinding !== undefined) {
625+
subModel = delegateBinding;
626+
subPath = valuePath;
625627
}
626628

627629
observer.addPath(subModel, subPath);
628630
}
629631

630632
observer.start();
631633
bindingModel = observer;
632-
bindingPath = 'value';
634+
bindingPath = valuePath;
633635
}
634636

635637
var binding = node.bind(name, bindingModel, bindingPath);
@@ -638,7 +640,7 @@
638640
}
639641
}
640642

641-
function parseAttributeBindings(element) {
643+
function parseAttributeBindings(element, delegatePrepareBindingFn) {
642644
assert(element);
643645

644646
var bindings;
@@ -661,7 +663,8 @@
661663
}
662664
}
663665

664-
var tokens = parseMustaches(value);
666+
var tokens = parseMustaches(value, name, element,
667+
delegatePrepareBindingFn);
665668
if (!tokens)
666669
continue;
667670

@@ -672,25 +675,26 @@
672675
// Treat <template if> as <template bind if>
673676
if (ifFound && !bindFound) {
674677
bindings = bindings || [];
675-
bindings.push(BIND, parseMustaches('{{}}'));
678+
bindings.push(BIND, parseMustaches('{{}}', BIND, element,
679+
delegatePrepareBindingFn));
676680
}
677681

678682
return bindings;
679683
}
680684

681-
function getBindings(node) {
685+
function getBindings(node, delegatePrepareBindingFn) {
682686
if (node.nodeType === Node.ELEMENT_NODE)
683-
return parseAttributeBindings(node);
687+
return parseAttributeBindings(node, delegatePrepareBindingFn);
684688

685689
if (node.nodeType === Node.TEXT_NODE) {
686-
var tokens = parseMustaches(node.data);
690+
var tokens = parseMustaches(node.data, 'textContent', node,
691+
delegatePrepareBindingFn);
687692
if (tokens)
688693
return ['textContent', tokens];
689694
}
690695
}
691696

692-
function addMapBindings(node, bindings, model, delegate, delegateGetBindingFn,
693-
bound) {
697+
function addMapBindings(node, bindings, model, delegate, bound) {
694698
if (!bindings)
695699
return;
696700

@@ -702,29 +706,27 @@
702706
}
703707

704708
if (bindings.length)
705-
processBindings(bindings, node, model, delegateGetBindingFn, bound);
709+
processBindings(bindings, node, model, bound);
706710

707711
if (!bindings.children)
708712
return;
709713

710714
var i = 0;
711715
for (var child = node.firstChild; child; child = child.nextSibling) {
712-
addMapBindings(child, bindings.children[i++], model, delegate,
713-
delegateGetBindingFn,
714-
bound);
716+
addMapBindings(child, bindings.children[i++], model, delegate, bound);
715717
}
716718
}
717719

718720
function addBindings(node, model, delegate) {
719721
assert(node);
720722

721-
var delegateGetBindingFn =
722-
delegate && typeof delegate.getBinding === 'function' ?
723-
delegate.getBinding : undefined;
723+
var delegatePrepareBindingFn =
724+
delegate && typeof delegate.prepareBinding === 'function' ?
725+
delegate.prepareBinding : undefined;
724726

725-
var bindings = getBindings(node);
727+
var bindings = getBindings(node, delegatePrepareBindingFn);
726728
if (bindings)
727-
processBindings(bindings, node, model, delegateGetBindingFn);
729+
processBindings(bindings, node, model);
728730

729731
for (var child = node.firstChild; child ; child = child.nextSibling)
730732
addBindings(child, model, delegate);
@@ -743,8 +745,8 @@
743745
return clone;
744746
}
745747

746-
function createInstanceBindingMap(node) {
747-
var map = getBindings(node);
748+
function createInstanceBindingMap(node, delegatePrepareBindingFn) {
749+
var map = getBindings(node, delegatePrepareBindingFn);
748750
if (isTemplate(node)) {
749751
map = map || [];
750752
map.templateRef = node;
@@ -753,7 +755,7 @@
753755

754756
var child = node.firstChild, index = 0;
755757
for (; child; child = child.nextSibling, index++) {
756-
var childMap = createInstanceBindingMap(child);
758+
var childMap = createInstanceBindingMap(child, delegatePrepareBindingFn);
757759
if (!childMap)
758760
continue;
759761

0 commit comments

Comments
 (0)