aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/directive/ngRepeat.js14
-rw-r--r--test/ng/directive/ngRepeatSpec.js38
2 files changed, 34 insertions, 18 deletions
diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js
index 66464c1b..d5d3a64c 100644
--- a/src/ng/directive/ngRepeat.js
+++ b/src/ng/directive/ngRepeat.js
@@ -12,10 +12,9 @@
* Special properties are exposed on the local scope of each template instance, including:
*
* * `$index` – `{number}` – iterator offset of the repeated element (0..length-1)
- * * `$position` – `{string}` – position of the repeated element in the iterator. One of:
- * * `'first'`,
- * * `'middle'`
- * * `'last'`
+ * * `$first` – `{boolean}` – true if the repeated element is first in the iterator.
+ * * `$middle` – `{boolean}` – true if the repeated element is between the first and last in the iterator.
+ * * `$last` – `{boolean}` – true if the repeated element is last in the iterator.
*
*
* @element ANY
@@ -145,9 +144,10 @@ var ngRepeatDirective = ngDirective({
childScope[valueIdent] = value;
if (keyIdent) childScope[keyIdent] = key;
childScope.$index = index;
- childScope.$position = index === 0 ?
- 'first' :
- (index == collectionLength - 1 ? 'last' : 'middle');
+
+ childScope.$first = (index === 0);
+ childScope.$last = (index === (collectionLength - 1));
+ childScope.$middle = !(childScope.$first || childScope.$last);
if (!last) {
linker(childScope, function(clone){
diff --git a/test/ng/directive/ngRepeatSpec.js b/test/ng/directive/ngRepeatSpec.js
index 5cb7196b..72382591 100644
--- a/test/ng/directive/ngRepeatSpec.js
+++ b/test/ng/directive/ngRepeatSpec.js
@@ -104,42 +104,58 @@ describe('ngRepeat', function() {
}));
- it('should expose iterator position as $position when iterating over arrays',
+ it('should expose iterator position as $first, $middle and $last when iterating over arrays',
inject(function($rootScope, $compile) {
element = $compile(
'<ul>' +
- '<li ng-repeat="item in items" ng-bind="item + \':\' + $position + \'|\'"></li>' +
+ '<li ng-repeat="item in items">{{item}}:{{$first}}-{{$middle}}-{{$last}}|</li>' +
'</ul>')($rootScope);
$rootScope.items = ['misko', 'shyam', 'doug'];
$rootScope.$digest();
- expect(element.text()).toEqual('misko:first|shyam:middle|doug:last|');
+ expect(element.text()).
+ toEqual('misko:true-false-false|shyam:false-true-false|doug:false-false-true|');
$rootScope.items.push('frodo');
$rootScope.$digest();
- expect(element.text()).toEqual('misko:first|shyam:middle|doug:middle|frodo:last|');
+ expect(element.text()).
+ toEqual('misko:true-false-false|' +
+ 'shyam:false-true-false|' +
+ 'doug:false-true-false|' +
+ 'frodo:false-false-true|');
$rootScope.items.pop();
$rootScope.items.pop();
$rootScope.$digest();
- expect(element.text()).toEqual('misko:first|shyam:last|');
+ expect(element.text()).toEqual('misko:true-false-false|shyam:false-false-true|');
+
+ $rootScope.items.pop();
+ $rootScope.$digest();
+ expect(element.text()).toEqual('misko:true-false-true|');
}));
- it('should expose iterator position as $position when iterating over objects',
+ it('should expose iterator position as $first, $middle and $last when iterating over objects',
inject(function($rootScope, $compile) {
element = $compile(
'<ul>' +
- '<li ng-repeat="(key, val) in items" ng-bind="key + \':\' + val + \':\' + $position + \'|\'">' +
- '</li>' +
+ '<li ng-repeat="(key, val) in items">{{key}}:{{val}}:{{$first}}-{{$middle}}-{{$last}}|</li>' +
'</ul>')($rootScope);
$rootScope.items = {'misko':'m', 'shyam':'s', 'doug':'d', 'frodo':'f'};
$rootScope.$digest();
- expect(element.text()).toEqual('doug:d:first|frodo:f:middle|misko:m:middle|shyam:s:last|');
+ expect(element.text()).
+ toEqual('doug:d:true-false-false|' +
+ 'frodo:f:false-true-false|' +
+ 'misko:m:false-true-false|' +
+ 'shyam:s:false-false-true|');
delete $rootScope.items.doug;
delete $rootScope.items.frodo;
$rootScope.$digest();
- expect(element.text()).toEqual('misko:m:first|shyam:s:last|');
+ expect(element.text()).toEqual('misko:m:true-false-false|shyam:s:false-false-true|');
+
+ delete $rootScope.items.shyam;
+ $rootScope.$digest();
+ expect(element.text()).toEqual('misko:m:true-false-true|');
}));
@@ -207,7 +223,7 @@ describe('ngRepeat', function() {
beforeEach(inject(function($rootScope, $compile) {
element = $compile(
'<ul>' +
- '<li ng-repeat="item in items" ng-bind="key + \':\' + val + \':\' + $position + \'|\'"></li>' +
+ '<li ng-repeat="item in items">{{key}}:{{val}}|></li>' +
'</ul>')($rootScope);
a = {};
b = {};