Skip to content

Commit 8284bcb

Browse files
committed
WIP: Fix tranclusion issues with ngRepeat, angular#4002
1 parent f12c61e commit 8284bcb

File tree

3 files changed

+47
-18
lines changed

3 files changed

+47
-18
lines changed

src/ng/compile.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,8 @@ function $CompileProvider($provide) {
809809
compileNode = $compileNode[0];
810810
replaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode);
811811

812+
$template.append(document.createComment(' end ' + directiveName + ': ' + templateAttrs[directiveName] + ' '))
813+
812814
childTranscludeFn = compile($template, transcludeFn, terminalPriority,
813815
replaceDirective && replaceDirective.name);
814816
} else {
@@ -836,7 +838,7 @@ function $CompileProvider($provide) {
836838
compileNode = $template[0];
837839

838840
if ($template.length != 1 || compileNode.nodeType !== 1) {
839-
throw $compileMinErr('tplrt', "Template for directive '{0}' must have exactly one root element. {1}", directiveName, '');
841+
throw $compileMinErr('tplrt', "Template for directive '{0}' must have exactly one root element. {1}", directiveName, templateAttrs[directiveName] +'');
840842
}
841843

842844
replaceWith(jqCollection, $compileNode, compileNode);

src/ng/directive/ngRepeat.js

+2
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
328328
if (lastBlockMap.hasOwnProperty(key)) {
329329
block = lastBlockMap[key];
330330
$animate.leave(block.elements);
331+
dump(block.elements);
331332
forEach(block.elements, function(element) { element[NG_REMOVED] = true});
332333
block.scope.$destroy();
333334
}
@@ -371,6 +372,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
371372

372373
if (!block.startNode) {
373374
linker(childScope, function(clone) {
375+
dump(clone);
374376
$animate.enter(clone, null, jqLite(previousNode));
375377
previousNode = clone;
376378
block.scope = childScope;

test/ng/directive/ngRepeatSpec.js

+42-17
Original file line numberDiff line numberDiff line change
@@ -843,28 +843,54 @@ describe('ngRepeat', function() {
843843
});
844844
});
845845

846-
it('should grow multi-node repeater', inject(function($compile, $rootScope) {
847-
$rootScope.show = false;
848-
$rootScope.books = [
849-
{title:'T1', description: 'D1'},
850-
{title:'T2', description: 'D2'}
851-
];
852-
element = $compile(
846+
847+
describe('ngRepeatStart', function () {
848+
it('should grow multi-node repeater', inject(function($compile, $rootScope) {
849+
$rootScope.show = false;
850+
$rootScope.books = [
851+
{title:'T1', description: 'D1'},
852+
{title:'T2', description: 'D2'}
853+
];
854+
element = $compile(
855+
'<div>' +
856+
'<dt ng-repeat-start="book in books">{{book.title}}:</dt>' +
857+
'<dd ng-repeat-end>{{book.description}};</dd>' +
858+
'</div>')($rootScope);
859+
860+
$rootScope.$digest();
861+
expect(element.text()).toEqual('T1:D1;T2:D2;');
862+
$rootScope.books.push({title:'T3', description: 'D3'});
863+
$rootScope.$digest();
864+
expect(element.text()).toEqual('T1:D1;T2:D2;T3:D3;');
865+
}));
866+
867+
868+
iit('should not clobber ng-if when updating collection', inject(function ($compile, $rootScope) {
869+
$rootScope.values = [1, 2, 3];
870+
$rootScope.showMe = true;
871+
872+
element = $compile(
853873
'<div>' +
854-
'<dt ng-repeat-start="book in books">{{book.title}}:</dt>' +
855-
'<dd ng-repeat-end>{{book.description}};</dd>' +
856-
'</div>')($rootScope);
874+
'<div ng-repeat-start="val in values">Value: {{val}} </div>' +
875+
'<div ng-if="showMe" ng-repeat-end>If : {{val}}</div>' +
876+
'</div>'
877+
)($rootScope);
857878

858-
$rootScope.$digest();
859-
expect(element.text()).toEqual('T1:D1;T2:D2;');
860-
$rootScope.books.push({title:'T3', description: 'D3'});
861-
$rootScope.$digest();
862-
expect(element.text()).toEqual('T1:D1;T2:D2;T3:D3;');
863-
}));
879+
$rootScope.$digest();
880+
expect(element.find('div').length).toBe(6);
864881

882+
$rootScope.values.shift();
883+
$rootScope.values.push(5);
865884

885+
$rootScope.$digest();
886+
dump(element);
887+
expect(element.find('div').length).toBe(6);
888+
expect(element.text()).not.toContain('If : 1');
889+
}));
890+
});
866891
});
867892

893+
868894
describe('ngRepeat animations', function() {
869895
var body, element, $rootElement;
870896

@@ -982,5 +1008,4 @@ describe('ngRepeat animations', function() {
9821008
item = $animate.flushNext('move').element;
9831009
expect(item.text()).toBe('1');
9841010
}));
985-
9861011
});

0 commit comments

Comments
 (0)