@@ -132,8 +132,7 @@ class NgRepeat {
132
132
_watch = _scope.watch (
133
133
_listExpr,
134
134
(CollectionChangeRecord changes, _) {
135
- if (changes is ! CollectionChangeRecord ) return ;
136
- _onChange (changes);
135
+ _onChange ((changes is CollectionChangeRecord ) ? changes : null );
137
136
},
138
137
collection: true ,
139
138
formatters: formatters
@@ -142,7 +141,8 @@ class NgRepeat {
142
141
143
142
// Computes and executes DOM changes when the item list changes
144
143
void _onChange (CollectionChangeRecord changes) {
145
- final int length = changes.length;
144
+ final iterable = (changes == null ) ? const [] : changes.iterable;
145
+ final int length = (changes == null ) ? 0 : changes.length;
146
146
final rows = new List <_Row >(length);
147
147
final changeFunctions = new List <Function >(length);
148
148
final removedIndexes = < int > [];
@@ -170,43 +170,51 @@ class NgRepeat {
170
170
_rows = new List <_Row >(length);
171
171
for (var i = 0 ; i < length; i++ ) {
172
172
changeFunctions[i] = (index, previousView) {
173
- addRow (index, changes. iterable.elementAt (i), previousView);
173
+ addRow (index, iterable.elementAt (i), previousView);
174
174
};
175
175
}
176
176
} else {
177
- changes.forEachRemoval ((CollectionChangeItem removal) {
178
- var index = removal.previousIndex;
179
- var row = _rows[index];
180
- row.scope.destroy ();
181
- _viewPort.remove (row.view);
182
- leftInDom.removeAt (domLength - 1 - index);
183
- });
177
+ if (changes == null ) {
178
+ _rows.forEach ((row) {
179
+ row.scope.destroy ();
180
+ _viewPort.remove (row.view);
181
+ });
182
+ leftInDom.clear ();
183
+ } else {
184
+ changes.forEachRemoval ((CollectionChangeItem removal) {
185
+ var index = removal.previousIndex;
186
+ var row = _rows[index];
187
+ row.scope.destroy ();
188
+ _viewPort.remove (row.view);
189
+ leftInDom.removeAt (domLength - 1 - index);
190
+ });
184
191
185
- changes.forEachAddition ((CollectionChangeItem addition) {
186
- changeFunctions[addition.currentIndex] = (index, previousView) {
187
- addRow (index, addition.item, previousView);
188
- };
189
- });
192
+ changes.forEachAddition ((CollectionChangeItem addition) {
193
+ changeFunctions[addition.currentIndex] = (index, previousView) {
194
+ addRow (index, addition.item, previousView);
195
+ };
196
+ });
190
197
191
- changes.forEachMove ((CollectionChangeItem move) {
192
- var previousIndex = move.previousIndex;
193
- var value = move.item;
194
- changeFunctions[move.currentIndex] = (index, previousView) {
195
- var previousRow = _rows[previousIndex];
196
- var childScope = previousRow.scope;
197
- var childContext = _updateContext (childScope.context, index, length);
198
- if (! identical (childScope.context[_valueIdentifier], value)) {
199
- childContext[_valueIdentifier] = value;
200
- }
201
- rows[index] = _rows[previousIndex];
202
- // Only move the DOM node when required
203
- if (domIndex < 0 || leftInDom[domIndex] != previousIndex) {
204
- _viewPort.move (previousRow.view, moveAfter: previousView);
205
- leftInDom.remove (previousIndex);
206
- }
207
- domIndex-- ;
208
- };
209
- });
198
+ changes.forEachMove ((CollectionChangeItem move) {
199
+ var previousIndex = move.previousIndex;
200
+ var value = move.item;
201
+ changeFunctions[move.currentIndex] = (index, previousView) {
202
+ var previousRow = _rows[previousIndex];
203
+ var childScope = previousRow.scope;
204
+ var childContext = _updateContext (childScope.context, index, length);
205
+ if (! identical (childScope.context[_valueIdentifier], value)) {
206
+ childContext[_valueIdentifier] = value;
207
+ }
208
+ rows[index] = _rows[previousIndex];
209
+ // Only move the DOM node when required
210
+ if (domIndex < 0 || leftInDom[domIndex] != previousIndex) {
211
+ _viewPort.move (previousRow.view, moveAfter: previousView);
212
+ leftInDom.remove (previousIndex);
213
+ }
214
+ domIndex-- ;
215
+ };
216
+ });
217
+ }
210
218
}
211
219
212
220
var previousView = null ;
0 commit comments