X Tutup
Skip to content

Commit 1779caf

Browse files
committed
fix(core): support ngFor that has an ngIf as last node
Fixes #6304 Closes #6878
1 parent 6ef2121 commit 1779caf

File tree

3 files changed

+52
-8
lines changed

3 files changed

+52
-8
lines changed

modules/angular2/src/core/linker/view.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,27 @@ function _flattenNestedViewRenderNodes(nodes: any[], renderNodes: any[]): any[]
338338
return renderNodes;
339339
}
340340

341+
export function findLastRenderNode(node: any): any {
342+
var lastNode;
343+
if (node instanceof AppElement) {
344+
var appEl = <AppElement>node;
345+
lastNode = appEl.nativeElement;
346+
if (isPresent(appEl.nestedViews)) {
347+
// Note: Views might have no root nodes at all!
348+
for (var i = appEl.nestedViews.length - 1; i >= 0; i--) {
349+
var nestedView = appEl.nestedViews[i];
350+
if (nestedView.rootNodesOrAppElements.length > 0) {
351+
lastNode = findLastRenderNode(
352+
nestedView.rootNodesOrAppElements[nestedView.rootNodesOrAppElements.length - 1]);
353+
}
354+
}
355+
}
356+
} else {
357+
lastNode = node;
358+
}
359+
return lastNode;
360+
}
361+
341362
export function checkSlotCount(componentName: string, expectedSlotCount: number,
342363
projectableNodes: any[][]): void {
343364
var givenSlotCount = isPresent(projectableNodes) ? projectableNodes.length : 0;

modules/angular2/src/core/linker/view_manager.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import {isPresent, isBlank, isArray} from 'angular2/src/facade/lang';
1010
import {ListWrapper, StringMapWrapper} from 'angular2/src/facade/collection';
1111
import {BaseException} from 'angular2/src/facade/exceptions';
12-
import {AppView, HostViewFactory, flattenNestedViewRenderNodes} from './view';
12+
import {AppView, HostViewFactory, flattenNestedViewRenderNodes, findLastRenderNode} from './view';
1313
import {AppElement} from './element';
1414
import {ElementRef, ElementRef_} from './element_ref';
1515
import {
@@ -344,12 +344,7 @@ export class AppViewManager_ extends AppViewManager {
344344
refNode = vcAppElement.nativeElement;
345345
}
346346
if (isPresent(refNode)) {
347-
var refRenderNode;
348-
if (refNode instanceof AppElement) {
349-
refRenderNode = (<AppElement>refNode).nativeElement;
350-
} else {
351-
refRenderNode = refNode;
352-
}
347+
var refRenderNode = findLastRenderNode(refNode);
353348
view.renderer.attachViewAfter(refRenderNode,
354349
flattenNestedViewRenderNodes(view.rootNodesOrAppElements));
355350
}

modules/angular2/test/common/directives/ng_for_spec.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
import {ListWrapper} from 'angular2/src/facade/collection';
1717
import {Component, View, TemplateRef, ContentChild} from 'angular2/core';
1818
import {NgFor} from 'angular2/src/common/directives/ng_for';
19+
import {NgIf} from 'angular2/src/common/directives/ng_if';
1920
import {By} from 'angular2/platform/common_dom';
2021

2122
export function main() {
@@ -232,6 +233,33 @@ export function main() {
232233
});
233234
}));
234235

236+
it('should repeat over nested ngIf that are the last node in the ngFor temlate',
237+
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
238+
var template =
239+
`<div><template ngFor #item [ngForOf]="items" #i="index"><div>{{i}}|</div>` +
240+
`<div *ngIf="i % 2 == 0">even|</div></template></div>`;
241+
242+
tcb.overrideTemplate(TestComponent, template)
243+
.createAsync(TestComponent)
244+
.then((fixture) => {
245+
var el = fixture.debugElement.nativeElement;
246+
var items = [1];
247+
fixture.debugElement.componentInstance.items = items;
248+
fixture.detectChanges();
249+
expect(el).toHaveText('0|even|');
250+
251+
items.push(1);
252+
fixture.detectChanges();
253+
expect(el).toHaveText('0|even|1|');
254+
255+
items.push(1);
256+
fixture.detectChanges();
257+
expect(el).toHaveText('0|even|1|2|even|');
258+
259+
async.done();
260+
});
261+
}));
262+
235263
it('should display indices correctly',
236264
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
237265
var template =
@@ -445,7 +473,7 @@ class Foo {
445473
}
446474

447475
@Component({selector: 'test-cmp'})
448-
@View({directives: [NgFor]})
476+
@View({directives: [NgFor, NgIf]})
449477
class TestComponent {
450478
@ContentChild(TemplateRef) contentTpl: TemplateRef;
451479
items: any;

0 commit comments

Comments
 (0)
X Tutup