mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-17 07:40:22 +00:00
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:
parent
8c269883fd
commit
7e746015ea
2 changed files with 25 additions and 5 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -293,6 +293,21 @@ describe('ngRepeat', function() {
|
|||
});
|
||||
|
||||
|
||||
it('should calculate $first, $middle and $last when we filter out properties from an obj', function() {
|
||||
element = $compile(
|
||||
'<ul>' +
|
||||
'<li ng-repeat="(key, val) in items">{{key}}:{{val}}:{{$first}}-{{$middle}}-{{$last}}|</li>' +
|
||||
'</ul>')(scope);
|
||||
scope.items = {'misko':'m', 'shyam':'s', 'doug':'d', 'frodo':'f', '$toBeFilteredOut': 'xxxx'};
|
||||
scope.$digest();
|
||||
expect(element.text()).
|
||||
toEqual('doug:d:true-false-false|' +
|
||||
'frodo:f:false-true-false|' +
|
||||
'misko:m:false-true-false|' +
|
||||
'shyam:s:false-false-true|');
|
||||
});
|
||||
|
||||
|
||||
it('should ignore $ and $$ properties', function() {
|
||||
element = $compile('<ul><li ng-repeat="i in items">{{i}}|</li></ul>')(scope);
|
||||
scope.items = ['a', 'b', 'c'];
|
||||
|
|
|
|||
Loading…
Reference in a new issue