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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/mdv/test/binding_syntax_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 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 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of mdv; 5 part of mdv;
6 6
7 // This code is a port of Model-Driven-Views: 7 // This code is a port of Model-Driven-Views:
8 // https://github.com/polymer-project/mdv 8 // https://github.com/polymer-project/mdv
9 // The code mostly comes from src/template_element.js 9 // The code mostly comes from src/template_element.js
10 10
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 !identical(terminator, _templateElement)) { 233 !identical(terminator, _templateElement)) {
234 var subIterator = _mdv(terminator)._templateIterator; 234 var subIterator = _mdv(terminator)._templateIterator;
235 if (subIterator != null) { 235 if (subIterator != null) {
236 return subIterator.getTerminatorAt(subIterator.terminators.length - 1); 236 return subIterator.getTerminatorAt(subIterator.terminators.length - 1);
237 } 237 }
238 } 238 }
239 239
240 return terminator; 240 return terminator;
241 } 241 }
242 242
243 void insertInstanceAt(int index, List<Node> instanceNodes) { 243 void insertInstanceAt(int index, DocumentFragment fragment,
244 List<Node> instanceNodes) {
245
244 var previousTerminator = getTerminatorAt(index - 1); 246 var previousTerminator = getTerminatorAt(index - 1);
245 var terminator = instanceNodes.length > 0 ? instanceNodes.last 247 var terminator = null;
246 : previousTerminator; 248 if (fragment != null) {
249 terminator = fragment.lastChild;
250 } else if (instanceNodes.length > 0) {
251 terminator = instanceNodes.last;
252 }
253 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
247 254
248 terminators.insert(index, terminator); 255 terminators.insert(index, terminator);
249 256
250 var parent = _templateElement.parentNode; 257 var parent = _templateElement.parentNode;
251 var insertBeforeNode = previousTerminator.nextNode; 258 var insertBeforeNode = previousTerminator.nextNode;
259
260 if (fragment != null) {
261 parent.insertBefore(fragment, insertBeforeNode);
262 return;
263 }
264
252 for (var node in instanceNodes) { 265 for (var node in instanceNodes) {
253 parent.insertBefore(node, insertBeforeNode); 266 parent.insertBefore(node, insertBeforeNode);
254 } 267 }
255 } 268 }
256 269
257 List<Node> extractInstanceAt(int index) { 270 List<Node> extractInstanceAt(int index) {
258 var instanceNodes = <Node>[]; 271 var instanceNodes = <Node>[];
259 var previousTerminator = getTerminatorAt(index - 1); 272 var previousTerminator = getTerminatorAt(index - 1);
260 var terminator = getTerminatorAt(index); 273 var terminator = getTerminatorAt(index);
261 terminators.removeAt(index); 274 terminators.removeAt(index);
262 275
263 var parent = _templateElement.parentNode; 276 var parent = _templateElement.parentNode;
264 while (terminator != previousTerminator) { 277 while (terminator != previousTerminator) {
265 var node = previousTerminator.nextNode; 278 var node = previousTerminator.nextNode;
266 if (node == terminator) terminator = previousTerminator; 279 if (node == terminator) terminator = previousTerminator;
267 node.remove(); 280 node.remove();
268 instanceNodes.add(node); 281 instanceNodes.add(node);
269 } 282 }
270 return instanceNodes; 283 return instanceNodes;
271 } 284 }
272 285
273 getInstanceModel(model, BindingDelegate delegate) { 286 getInstanceModel(model, BindingDelegate delegate) {
274 if (delegate != null) { 287 if (delegate != null) {
275 return delegate.getInstanceModel(_templateElement, model); 288 return delegate.getInstanceModel(_templateElement, model);
276 } 289 }
277 return model; 290 return model;
278 } 291 }
279 292
280 List<Node> getInstanceNodes(model, BindingDelegate delegate, 293 DocumentFragment getInstanceFragment(model, BindingDelegate delegate) {
281 IdentityMap instanceCache) { 294 return _templateElement.createInstance(model, delegate);
282
283 var instanceNodes = instanceCache.remove(model);
284 if (instanceNodes != null) return instanceNodes;
285
286 var fragment = _templateElement.createInstance(model, delegate);
287 instanceNodes = fragment.nodes.toList();
288 fragment.nodes.clear();
289 return instanceNodes;
290 } 295 }
291 296
292 void _handleChanges(Iterable<ChangeRecord> splices) { 297 void _handleChanges(Iterable<ChangeRecord> splices) {
293 if (closed) return; 298 if (closed) return;
294 299
295 splices = splices.where((s) => s is ListChangeRecord); 300 splices = splices.where((s) => s is ListChangeRecord);
296 301
297 var template = _templateElement; 302 var template = _templateElement;
298 var delegate = template.bindingDelegate; 303 var delegate = template.bindingDelegate;
299 304
(...skipping 18 matching lines...) Expand all
318 } 323 }
319 324
320 removeDelta -= splice.addedCount; 325 removeDelta -= splice.addedCount;
321 } 326 }
322 327
323 for (var splice in splices) { 328 for (var splice in splices) {
324 for (var addIndex = splice.index; 329 for (var addIndex = splice.index;
325 addIndex < splice.index + splice.addedCount; 330 addIndex < splice.index + splice.addedCount;
326 addIndex++) { 331 addIndex++) {
327 332
328 var model = getInstanceModel(iteratedValue[addIndex], delegate); 333 var model = iteratedValue[addIndex];
334 var fragment = null;
335 var instanceNodes = instanceCache.remove(model);
336 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
337 var actualModel = getInstanceModel(model, delegate);
338 fragment = getInstanceFragment(actualModel, delegate);
339 }
329 340
330 var instanceNodes = getInstanceNodes(model, delegate, instanceCache); 341 insertInstanceAt(addIndex, fragment, instanceNodes);
331 insertInstanceAt(addIndex, instanceNodes);
332 } 342 }
333 } 343 }
334 344
335 for (var instanceNodes in instanceCache.values) { 345 for (var instanceNodes in instanceCache.values) {
336 instanceNodes.forEach(_unbindAllRecursively); 346 instanceNodes.forEach(_unbindAllRecursively);
337 } 347 }
338 } 348 }
339 349
340 void unobserve() { 350 void unobserve() {
341 if (_sub == null) return; 351 if (_sub == null) return;
(...skipping 21 matching lines...) Expand all
363 nodeExt._templateIterator = null; 373 nodeExt._templateIterator = null;
364 } 374 }
365 } 375 }
366 376
367 _nodeOrCustom(node).unbindAll(); 377 _nodeOrCustom(node).unbindAll();
368 for (var c = node.firstChild; c != null; c = c.nextNode) { 378 for (var c = node.firstChild; c != null; c = c.nextNode) {
369 _unbindAllRecursively(c); 379 _unbindAllRecursively(c);
370 } 380 }
371 } 381 }
372 } 382 }
OLDNEW
« 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