Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Commit

Permalink
fix(ngRepeat): attempt to simplify and improve existing fix for #933
Browse files Browse the repository at this point in the history
I'm keeping this in for future reference. The issue with this solution
is that if we shift() the first item in the array, the whole repeater
DOM will be rebuilt from scratch, we need to do better than that.
  • Loading branch information
IgorMinar committed Nov 26, 2012
1 parent e7d37ee commit d644dcf
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 27 deletions.
4 changes: 2 additions & 2 deletions src/apis.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,12 @@ HashQueueMap.prototype = {
}
}
},

/**
* return the first item without deleting it
*/
peek: function(key) {
var array = this[key = hashKey(key)];
var array = this[hashKey(key)];
if (array) {
return array[0];
}
Expand Down
34 changes: 9 additions & 25 deletions src/ng/directive/ngRepeat.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ var ngRepeatDirective = ngDirective({
// We need an array of these objects since the same object can be returned from the iterator.
// We expect this to be a rare case.
var lastOrder = new HashQueueMap();
var indexValues = [];

scope.$watch(function ngRepeatWatch(scope){
var index, length,
collection = scope.$eval(rhs),
Expand Down Expand Up @@ -119,18 +119,14 @@ var ngRepeatDirective = ngDirective({
key = (collection === array) ? index : array[index];
value = collection[key];

// if collection is array and value is object, it can be shifted to allow for position change
// if collection is array and value is not object, need to first check whether index is same to
// avoid shifting wrong value
// if collection is not array, need to always check index to avoid shifting wrong value
if (lastOrder.peek(value)) {
last = collection === array ?
((isObject(value)) ? lastOrder.shift(value) :
(index === lastOrder.peek(value).index ? lastOrder.shift(value) : undefined)) :
(index === lastOrder.peek(value).index ? lastOrder.shift(value) : undefined);
} else {
last = undefined;
}
// if value is object, it can be shifted to allow for position change
// if is not object, need to first check whether index is same to avoid shifting wrong val
last = isObject(value)
? lastOrder.shift(value)
: (last = lastOrder.peek(value)) && (index === last.index)
? lastOrder.shift(value)
: undefined;


if (last) {
// if we have already seen this object, then we need to reuse the
Expand All @@ -151,12 +147,6 @@ var ngRepeatDirective = ngDirective({
cursor = last.element;
}
} else {
if (indexValues.hasOwnProperty(index) && collection !== array) {
var preValue = indexValues[index];
var v = lastOrder.shift(preValue);
v.element.remove();
v.scope.$destroy();
}
// new item which we don't know about
childScope = scope.$new();
}
Expand All @@ -178,16 +168,10 @@ var ngRepeatDirective = ngDirective({
index: index
};
nextOrder.push(value, last);
indexValues[index] = value;
});
}
}

var i, l;
for (i = 0, l = indexValues.length - length; i < l; i++) {
indexValues.pop();
}

//shrink children
for (key in lastOrder) {
if (lastOrder.hasOwnProperty(key)) {
Expand Down

0 comments on commit d644dcf

Please sign in to comment.