From 747d5fac8d55e959008797cd4659bc98bc59e9db Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 8 May 2014 10:04:42 +0200 Subject: [PATCH] refactor(ng-repeat): refactor fix for #1015 --- lib/directive/ng_repeat.dart | 87 ++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/lib/directive/ng_repeat.dart b/lib/directive/ng_repeat.dart index f4b480b7c..b13d4497d 100644 --- a/lib/directive/ng_repeat.dart +++ b/lib/directive/ng_repeat.dart @@ -132,7 +132,15 @@ class NgRepeat { _watch = _scope.watch( _listExpr, (CollectionChangeRecord changes, _) { - _onChange((changes is CollectionChangeRecord) ? changes : null); + if (changes is CollectionChangeRecord) { + _onCollectionChange(changes); + } else if (_rows != null) { + _rows.forEach((row) { + row.scope.destroy(); + _viewPort.remove(row.view); + }); + _rows = null; + } }, collection: true, formatters: formatters @@ -140,9 +148,8 @@ class NgRepeat { } // Computes and executes DOM changes when the item list changes - void _onChange(CollectionChangeRecord changes) { - final iterable = (changes == null) ? const [] : changes.iterable; - final int length = (changes == null) ? 0 : changes.length; + void _onCollectionChange(CollectionChangeRecord changes) { + final int length = changes.length; final rows = new List<_Row>(length); final changeFunctions = new List(length); final removedIndexes = []; @@ -170,51 +177,43 @@ class NgRepeat { _rows = new List<_Row>(length); for (var i = 0; i < length; i++) { changeFunctions[i] = (index, previousView) { - addRow(index, iterable.elementAt(i), previousView); + addRow(index, changes.iterable.elementAt(i), previousView); }; } } else { - if (changes == null) { - _rows.forEach((row) { - row.scope.destroy(); - _viewPort.remove(row.view); - }); - leftInDom.clear(); - } else { - changes.forEachRemoval((CollectionChangeItem removal) { - var index = removal.previousIndex; - var row = _rows[index]; - row.scope.destroy(); - _viewPort.remove(row.view); - leftInDom.removeAt(domLength - 1 - index); - }); + changes.forEachRemoval((CollectionChangeItem removal) { + var index = removal.previousIndex; + var row = _rows[index]; + row.scope.destroy(); + _viewPort.remove(row.view); + leftInDom.removeAt(domLength - 1 - index); + }); - changes.forEachAddition((CollectionChangeItem addition) { - changeFunctions[addition.currentIndex] = (index, previousView) { - addRow(index, addition.item, previousView); - }; - }); + changes.forEachAddition((CollectionChangeItem addition) { + changeFunctions[addition.currentIndex] = (index, previousView) { + addRow(index, addition.item, previousView); + }; + }); - changes.forEachMove((CollectionChangeItem move) { - var previousIndex = move.previousIndex; - var value = move.item; - changeFunctions[move.currentIndex] = (index, previousView) { - var previousRow = _rows[previousIndex]; - var childScope = previousRow.scope; - var childContext = _updateContext(childScope.context, index, length); - if (!identical(childScope.context[_valueIdentifier], value)) { - childContext[_valueIdentifier] = value; - } - rows[index] = _rows[previousIndex]; - // Only move the DOM node when required - if (domIndex < 0 || leftInDom[domIndex] != previousIndex) { - _viewPort.move(previousRow.view, moveAfter: previousView); - leftInDom.remove(previousIndex); - } - domIndex--; - }; - }); - } + changes.forEachMove((CollectionChangeItem move) { + var previousIndex = move.previousIndex; + var value = move.item; + changeFunctions[move.currentIndex] = (index, previousView) { + var previousRow = _rows[previousIndex]; + var childScope = previousRow.scope; + var childContext = _updateContext(childScope.context, index, length); + if (!identical(childScope.context[_valueIdentifier], value)) { + childContext[_valueIdentifier] = value; + } + rows[index] = _rows[previousIndex]; + // Only move the DOM node when required + if (domIndex < 0 || leftInDom[domIndex] != previousIndex) { + _viewPort.move(previousRow.view, moveAfter: previousView); + leftInDom.remove(previousIndex); + } + domIndex--; + }; + }); } var previousView = null;