OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 part of template_binding; | |
6 | |
7 class _InstanceBindingMap { | |
8 final List bindings; | |
9 List<_InstanceBindingMap> children; | |
10 DocumentFragment content; | |
11 | |
12 bool get isTemplate => false; | |
13 | |
14 _InstanceBindingMap(this.bindings); | |
15 | |
16 _InstanceBindingMap getChild(int index) { | |
17 if (children == null || index >= children.length) return null; | |
18 return children[index]; | |
19 } | |
20 } | |
21 | |
22 class _TemplateBindingMap extends _InstanceBindingMap { | |
23 bool get isTemplate => true; | |
24 | |
25 MustacheTokens _if, _bind, _repeat; | |
26 | |
27 _TemplateBindingMap(List bindings) : super(bindings); | |
28 } | |
29 | |
30 _InstanceBindingMap _createInstanceBindingMap(Node node, | |
31 BindingDelegate delegate) { | |
32 | |
33 _InstanceBindingMap map = _getBindings(node, delegate); | |
34 if (map == null) map = new _InstanceBindingMap([]); | |
35 | |
36 List children = null; | |
37 int index = 0; | |
38 for (var c = node.firstChild; c != null; c = c.nextNode, index++) { | |
39 var childMap = _createInstanceBindingMap(c, delegate); | |
40 if (childMap == null) continue; | |
41 | |
42 // TODO(jmesserly): use a sparse map instead? | |
43 if (children == null) children = new List(node.nodes.length); | |
44 children[index] = childMap; | |
45 } | |
46 map.children = children; | |
47 | |
48 return map; | |
49 } | |
50 | |
51 Node _cloneAndBindInstance(Node node, Node parent, Document stagingDocument, | |
52 _InstanceBindingMap bindings, model, BindingDelegate delegate, | |
53 List instanceBindings, [TemplateInstance instanceRecord]) { | |
54 | |
55 var clone = parent.append(stagingDocument.importNode(node, false)); | |
56 | |
57 int i = 0; | |
58 for (var c = node.firstChild; c != null; c = c.nextNode, i++) { | |
59 var childMap = bindings != null ? bindings.getChild(i) : null; | |
60 _cloneAndBindInstance(c, clone, stagingDocument, childMap, model, delegate, | |
61 instanceBindings); | |
62 } | |
63 | |
64 if (bindings.isTemplate) { | |
65 TemplateBindExtension.decorate(clone, node); | |
66 if (delegate != null) { | |
67 templateBindFallback(clone).bindingDelegate = delegate; | |
68 } | |
69 } | |
70 | |
71 _processBindings(clone, bindings, model, instanceBindings); | |
72 return clone; | |
73 } | |
74 | |
75 // TODO(rafaelw): Setup a MutationObserver on content which clears the expando | |
76 // so that bindingMaps regenerate when template.content changes. | |
77 _getInstanceBindingMap(DocumentFragment content, BindingDelegate delegate) { | |
78 if (delegate == null) delegate = BindingDelegate._DEFAULT; | |
79 | |
80 if (delegate._bindingMaps == null) delegate._bindingMaps = new Expando(); | |
81 var map = delegate._bindingMaps[content]; | |
82 if (map == null) { | |
83 map = _createInstanceBindingMap(content, delegate); | |
84 delegate._bindingMaps[content] = map; | |
85 } | |
86 return map; | |
87 } | |
OLD | NEW |