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

ngRepeat: insert end comment only after last element, not after each iterated item #4786

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/ng/directive/ngRepeat.js
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,9 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {

if (!block.startNode) {
linker(childScope, function(clone) {
clone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' ');
if(childScope.$last) {
clone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' ');
}
$animate.enter(clone, null, jqLite(previousNode));
previousNode = clone;
block.scope = childScope;
Expand Down
11 changes: 1 addition & 10 deletions test/BinderSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ describe('Binder', function() {
'<ul>' +
'<!-- ngRepeat: item in model.items -->' +
'<li ng-bind="item.a" ng-repeat="item in model.items">A</li>' +
'<!-- end ngRepeat: item in model.items -->' +
'<li ng-bind="item.a" ng-repeat="item in model.items">B</li>' +
'<!-- end ngRepeat: item in model.items -->' +
'</ul>');
Expand All @@ -107,9 +106,7 @@ describe('Binder', function() {
'<ul>' +
'<!-- ngRepeat: item in model.items -->' +
'<li ng-bind="item.a" ng-repeat="item in model.items">C</li>' +
'<!-- end ngRepeat: item in model.items -->' +
'<li ng-bind="item.a" ng-repeat="item in model.items">A</li>' +
'<!-- end ngRepeat: item in model.items -->' +
'<li ng-bind="item.a" ng-repeat="item in model.items">B</li>' +
'<!-- end ngRepeat: item in model.items -->' +
'</ul>');
Expand All @@ -120,7 +117,6 @@ describe('Binder', function() {
'<ul>' +
'<!-- ngRepeat: item in model.items -->' +
'<li ng-bind="item.a" ng-repeat="item in model.items">A</li>' +
'<!-- end ngRepeat: item in model.items -->' +
'<li ng-bind="item.a" ng-repeat="item in model.items">B</li>' +
'<!-- end ngRepeat: item in model.items -->' +
'</ul>');
Expand Down Expand Up @@ -231,15 +227,12 @@ describe('Binder', function() {
'<div name="a" ng-repeat="m in model">'+
'<!-- ngRepeat: i in m.item -->' +
'<ul name="a1" ng-repeat="i in m.item"></ul>'+
'<!-- end ngRepeat: i in m.item -->' +
'<ul name="a2" ng-repeat="i in m.item"></ul>'+
'<!-- end ngRepeat: i in m.item -->' +
'</div>'+
'<!-- end ngRepeat: m in model -->' +
'<div name="b" ng-repeat="m in model">'+
'<!-- ngRepeat: i in m.item -->' +
'<ul name="b1" ng-repeat="i in m.item"></ul>'+
'<!-- end ngRepeat: i in m.item -->' +
'<ul name="b2" ng-repeat="i in m.item"></ul>'+
'<!-- end ngRepeat: i in m.item -->' +
'</div>' +
Expand Down Expand Up @@ -322,14 +315,13 @@ describe('Binder', function() {
$rootScope.$apply();

var d1 = jqLite(element[0].childNodes[1]);
var d2 = jqLite(element[0].childNodes[3]);
var d2 = jqLite(element[0].childNodes[2]);
expect(d1.hasClass('o')).toBeTruthy();
expect(d2.hasClass('e')).toBeTruthy();
expect(sortedHtml(element)).toBe(
'<div>' +
'<!-- ngRepeat: i in [0,1] -->' +
'<div class="o" ng-class-even="\'e\'" ng-class-odd="\'o\'" ng-repeat="i in [0,1]"></div>' +
'<!-- end ngRepeat: i in [0,1] -->' +
'<div class="e" ng-class-even="\'e\'" ng-class-odd="\'o\'" ng-repeat="i in [0,1]"></div>' +
'<!-- end ngRepeat: i in [0,1] -->' +
'</div>');
Expand Down Expand Up @@ -437,7 +429,6 @@ describe('Binder', function() {
'<ul>' +
'<!-- ngRepeat: (k,v) in {a:0,b:1} -->' +
'<li ng-bind=\"k + v\" ng-repeat="(k,v) in {a:0,b:1}">a0</li>' +
'<!-- end ngRepeat: (k,v) in {a:0,b:1} -->' +
'<li ng-bind=\"k + v\" ng-repeat="(k,v) in {a:0,b:1}">b1</li>' +
'<!-- end ngRepeat: (k,v) in {a:0,b:1} -->' +
'</ul>');
Expand Down
8 changes: 4 additions & 4 deletions test/ng/directive/ngClassSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ describe('ngClass', function() {
element = $compile('<ul><li ng-repeat="i in [0,1]" class="existing" ng-class-odd="\'odd\'" ng-class-even="\'even\'"></li><ul>')($rootScope);
$rootScope.$digest();
var e1 = jqLite(element[0].childNodes[1]);
var e2 = jqLite(element[0].childNodes[3]);
var e2 = jqLite(element[0].childNodes[2]);
expect(e1.hasClass('existing')).toBeTruthy();
expect(e1.hasClass('odd')).toBeTruthy();
expect(e2.hasClass('existing')).toBeTruthy();
Expand All @@ -181,7 +181,7 @@ describe('ngClass', function() {
'<ul>')($rootScope);
$rootScope.$apply();
var e1 = jqLite(element[0].childNodes[1]);
var e2 = jqLite(element[0].childNodes[3]);
var e2 = jqLite(element[0].childNodes[2]);

expect(e1.hasClass('plainClass')).toBeTruthy();
expect(e1.hasClass('odd')).toBeTruthy();
Expand All @@ -199,7 +199,7 @@ describe('ngClass', function() {
'<ul>')($rootScope);
$rootScope.$apply();
var e1 = jqLite(element[0].childNodes[1]);
var e2 = jqLite(element[0].childNodes[3]);
var e2 = jqLite(element[0].childNodes[2]);

expect(e1.hasClass('A')).toBeTruthy();
expect(e1.hasClass('B')).toBeTruthy();
Expand Down Expand Up @@ -273,7 +273,7 @@ describe('ngClass', function() {
$rootScope.$digest();

var e1 = jqLite(element[0].childNodes[1]);
var e2 = jqLite(element[0].childNodes[3]);
var e2 = jqLite(element[0].childNodes[2]);

expect(e1.hasClass('odd')).toBeTruthy();
expect(e1.hasClass('even')).toBeFalsy();
Expand Down
36 changes: 29 additions & 7 deletions test/ng/directive/ngRepeatSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -621,7 +621,6 @@ describe('ngRepeat', function() {
'<div>' +
'<!-- ngRepeat: i in items -->' +
'<div ng-repeat="i in items" rr="">1|</div>' +
'<!-- end ngRepeat: i in items -->' +
'<div ng-repeat="i in items" rr="">2|</div>' +
'<!-- end ngRepeat: i in items -->' +
'</div>'
Expand Down Expand Up @@ -653,7 +652,6 @@ describe('ngRepeat', function() {
'<div>' +
'<!-- ngRepeat: i in items -->' +
'<div ng-repeat="i in items" rr="">1|</div>' +
'<!-- end ngRepeat: i in items -->' +
'<div ng-repeat="i in items" rr="">2|</div>' +
'<!-- end ngRepeat: i in items -->' +
'</div>'
Expand Down Expand Up @@ -752,16 +750,12 @@ describe('ngRepeat', function() {
});


it('should add separator comments after each item', inject(function ($compile, $rootScope) {
it('should add separator comment after end of block', inject(function ($compile, $rootScope) {
var check = function () {
var children = element.find('div');
expect(children.length).toBe(3);

// Note: COMMENT_NODE === 8
expect(children[0].nextSibling.nodeType).toBe(8);
expect(children[0].nextSibling.nodeValue).toBe(' end ngRepeat: val in values ');
expect(children[1].nextSibling.nodeType).toBe(8);
expect(children[1].nextSibling.nodeValue).toBe(' end ngRepeat: val in values ');
expect(children[2].nextSibling.nodeType).toBe(8);
expect(children[2].nextSibling.nodeValue).toBe(' end ngRepeat: val in values ');
}
Expand Down Expand Up @@ -1034,6 +1028,34 @@ describe('ngRepeat', function() {
}));


it('should properly react to list change', inject(function ($compile, $rootScope) {
$rootScope.values = [1, 2, 3];
$rootScope.showMe = true;

element = $compile(
'<div>' +
'<div ng-repeat-start="val in values">val:{{val}};</div>' +
'<div ng-repeat-end>val-end:{{val}};</div>' +
'</div>'
)($rootScope);

$rootScope.$digest();
expect(element.find('div').length).toBe(6);

$rootScope.values.shift();
$rootScope.values.push(4);

$rootScope.$digest();
console.log(element.html());
console.log($rootScope.values);
expect(element.find('div').length).toBe(6);
expect(element.text()).not.toContain('val:1;');
expect(element.text()).not.toContain('val-end:1;');
expect(element.text()).toContain('val:4;');
expect(element.text()).toContain('val-end:4;');
}));


it('should not clobber ng-if when updating collection', inject(function ($compile, $rootScope) {
$rootScope.values = [1, 2, 3];
$rootScope.showMe = true;
Expand Down