Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1183)

Unified Diff: pkg/mdv/lib/src/template_iterator.dart

Issue 19689009: Ensure getInstanceModel is only called when a new instance will be created (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/mdv/test/binding_syntax_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/mdv/lib/src/template_iterator.dart
diff --git a/pkg/mdv/lib/src/template_iterator.dart b/pkg/mdv/lib/src/template_iterator.dart
index dd57cad3118bd6668e9d738cd90441277bc43790..6a39418c617e3b19af94349950f03e1b4df4a2a7 100644
--- a/pkg/mdv/lib/src/template_iterator.dart
+++ b/pkg/mdv/lib/src/template_iterator.dart
@@ -240,15 +240,28 @@ class _TemplateIterator {
return terminator;
}
- void insertInstanceAt(int index, List<Node> instanceNodes) {
+ void insertInstanceAt(int index, DocumentFragment fragment,
+ List<Node> instanceNodes) {
+
var previousTerminator = getTerminatorAt(index - 1);
- var terminator = instanceNodes.length > 0 ? instanceNodes.last
- : previousTerminator;
+ var terminator = null;
+ if (fragment != null) {
+ terminator = fragment.lastChild;
+ } else if (instanceNodes.length > 0) {
+ terminator = instanceNodes.last;
+ }
+ if (terminator == null) terminator = previousTerminator;
justinfagnani 2013/07/23 20:42:06 Initialize terminator to null? I'm not sure if fra
Jennifer Messerly 2013/07/23 20:49:39 :confused: it is initialized to null ... yes, frag
terminators.insert(index, terminator);
var parent = _templateElement.parentNode;
var insertBeforeNode = previousTerminator.nextNode;
+
+ if (fragment != null) {
+ parent.insertBefore(fragment, insertBeforeNode);
+ return;
+ }
+
for (var node in instanceNodes) {
parent.insertBefore(node, insertBeforeNode);
}
@@ -277,16 +290,8 @@ class _TemplateIterator {
return model;
}
- List<Node> getInstanceNodes(model, BindingDelegate delegate,
- IdentityMap instanceCache) {
-
- var instanceNodes = instanceCache.remove(model);
- if (instanceNodes != null) return instanceNodes;
-
- var fragment = _templateElement.createInstance(model, delegate);
- instanceNodes = fragment.nodes.toList();
- fragment.nodes.clear();
- return instanceNodes;
+ DocumentFragment getInstanceFragment(model, BindingDelegate delegate) {
+ return _templateElement.createInstance(model, delegate);
}
void _handleChanges(Iterable<ChangeRecord> splices) {
@@ -325,10 +330,15 @@ class _TemplateIterator {
addIndex < splice.index + splice.addedCount;
addIndex++) {
- var model = getInstanceModel(iteratedValue[addIndex], delegate);
+ var model = iteratedValue[addIndex];
+ var fragment = null;
+ var instanceNodes = instanceCache.remove(model);
+ if (instanceNodes == null) {
justinfagnani 2013/07/23 20:42:06 check for empty too?
Jennifer Messerly 2013/07/23 20:49:39 if we expanded to an empty set of nodes before (he
+ var actualModel = getInstanceModel(model, delegate);
+ fragment = getInstanceFragment(actualModel, delegate);
+ }
- var instanceNodes = getInstanceNodes(model, delegate, instanceCache);
- insertInstanceAt(addIndex, instanceNodes);
+ insertInstanceAt(addIndex, fragment, instanceNodes);
}
}
« no previous file with comments | « no previous file | pkg/mdv/test/binding_syntax_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698