fix(ngRepeat): correctly apply $last if repeating over object

If the $last property is calculated from the original collectionLength
on an object and properties starting with $ were filtered out, then $last
is never applied and $middle is applied erroniously.

Closes #1789
This commit is contained in:
Pete Bacon Darwin
2013-01-11 12:47:38 +00:00
committed by Igor Minar
parent 7c60151cb8
commit ed2fd2d0ca
2 changed files with 25 additions and 5 deletions

View File

@@ -92,14 +92,17 @@ var ngRepeatDirective = ngDirective({
scope.$watch(function ngRepeatWatch(scope){
var index, length,
collection = scope.$eval(rhs),
collectionLength = size(collection, true),
childScope,
cursor = iterStartElement, // current position of the node
// Same as lastOrder but it has the current state. It will become the
// lastOrder on the next iteration.
nextOrder = new HashQueueMap(),
arrayLength,
childScope,
key, value, // key/value of iteration
array, last, // last object information {scope, element, index}
cursor = iterStartElement; // current position of the node
array,
last; // last object information {scope, element, index}
if (!isArray(collection)) {
// if object, extract keys, sort them and use to determine order of iteration over obj props
@@ -114,6 +117,8 @@ var ngRepeatDirective = ngDirective({
array = collection || [];
}
arrayLength = array.length;
// we are not using forEach for perf reasons (trying to avoid #call)
for (index = 0, length = array.length; index < length; index++) {
key = (collection === array) ? index : array[index];
@@ -149,7 +154,7 @@ var ngRepeatDirective = ngDirective({
childScope.$index = index;
childScope.$first = (index === 0);
childScope.$last = (index === (collectionLength - 1));
childScope.$last = (index === (arrayLength - 1));
childScope.$middle = !(childScope.$first || childScope.$last);
if (!last) {