From 8284bcb092213ddc640074eb2a1102ecef227b89 Mon Sep 17 00:00:00 2001 From: Jeff Cross Date: Fri, 20 Sep 2013 17:10:06 -0700 Subject: [PATCH] WIP: Fix tranclusion issues with ngRepeat, #4002 --- src/ng/compile.js | 4 ++- src/ng/directive/ngRepeat.js | 2 ++ test/ng/directive/ngRepeatSpec.js | 59 ++++++++++++++++++++++--------- 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/ng/compile.js b/src/ng/compile.js index d97aeaf6e557..9c0136ff3a89 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -809,6 +809,8 @@ function $CompileProvider($provide) { compileNode = $compileNode[0]; replaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode); + $template.append(document.createComment(' end ' + directiveName + ': ' + templateAttrs[directiveName] + ' ')) + childTranscludeFn = compile($template, transcludeFn, terminalPriority, replaceDirective && replaceDirective.name); } else { @@ -836,7 +838,7 @@ function $CompileProvider($provide) { compileNode = $template[0]; if ($template.length != 1 || compileNode.nodeType !== 1) { - throw $compileMinErr('tplrt', "Template for directive '{0}' must have exactly one root element. {1}", directiveName, ''); + throw $compileMinErr('tplrt', "Template for directive '{0}' must have exactly one root element. {1}", directiveName, templateAttrs[directiveName] +''); } replaceWith(jqCollection, $compileNode, compileNode); diff --git a/src/ng/directive/ngRepeat.js b/src/ng/directive/ngRepeat.js index 50be2a618e68..eb7f67cfebe5 100644 --- a/src/ng/directive/ngRepeat.js +++ b/src/ng/directive/ngRepeat.js @@ -328,6 +328,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) { if (lastBlockMap.hasOwnProperty(key)) { block = lastBlockMap[key]; $animate.leave(block.elements); + dump(block.elements); forEach(block.elements, function(element) { element[NG_REMOVED] = true}); block.scope.$destroy(); } @@ -371,6 +372,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) { if (!block.startNode) { linker(childScope, function(clone) { + dump(clone); $animate.enter(clone, null, jqLite(previousNode)); previousNode = clone; block.scope = childScope; diff --git a/test/ng/directive/ngRepeatSpec.js b/test/ng/directive/ngRepeatSpec.js index fc41bc6d71eb..98291a631f1b 100644 --- a/test/ng/directive/ngRepeatSpec.js +++ b/test/ng/directive/ngRepeatSpec.js @@ -843,28 +843,54 @@ describe('ngRepeat', function() { }); }); - it('should grow multi-node repeater', inject(function($compile, $rootScope) { - $rootScope.show = false; - $rootScope.books = [ - {title:'T1', description: 'D1'}, - {title:'T2', description: 'D2'} - ]; - element = $compile( + + describe('ngRepeatStart', function () { + it('should grow multi-node repeater', inject(function($compile, $rootScope) { + $rootScope.show = false; + $rootScope.books = [ + {title:'T1', description: 'D1'}, + {title:'T2', description: 'D2'} + ]; + element = $compile( + '
' + + '
{{book.title}}:
' + + '
{{book.description}};
' + + '
')($rootScope); + + $rootScope.$digest(); + expect(element.text()).toEqual('T1:D1;T2:D2;'); + $rootScope.books.push({title:'T3', description: 'D3'}); + $rootScope.$digest(); + expect(element.text()).toEqual('T1:D1;T2:D2;T3:D3;'); + })); + + + iit('should not clobber ng-if when updating collection', inject(function ($compile, $rootScope) { + $rootScope.values = [1, 2, 3]; + $rootScope.showMe = true; + + element = $compile( '
' + - '
{{book.title}}:
' + - '
{{book.description}};
' + - '
')($rootScope); + '
Value: {{val}}
' + + '
If : {{val}}
' + + '' + )($rootScope); - $rootScope.$digest(); - expect(element.text()).toEqual('T1:D1;T2:D2;'); - $rootScope.books.push({title:'T3', description: 'D3'}); - $rootScope.$digest(); - expect(element.text()).toEqual('T1:D1;T2:D2;T3:D3;'); - })); + $rootScope.$digest(); + expect(element.find('div').length).toBe(6); + $rootScope.values.shift(); + $rootScope.values.push(5); + $rootScope.$digest(); + dump(element); + expect(element.find('div').length).toBe(6); + expect(element.text()).not.toContain('If : 1'); + })); + }); }); + describe('ngRepeat animations', function() { var body, element, $rootElement; @@ -982,5 +1008,4 @@ describe('ngRepeat animations', function() { item = $animate.flushNext('move').element; expect(item.text()).toBe('1'); })); - });