diff --git a/packages/core/src/render3/query.ts b/packages/core/src/render3/query.ts index 10ad1d0256..ca1b736a1b 100644 --- a/packages/core/src/render3/query.ts +++ b/packages/core/src/render3/query.ts @@ -363,9 +363,7 @@ function collectQueryResults(tView: TView, lView: LView, queryIndex: number, for (let i = 0; i < tQueryMatches.length; i += 2) { const tNodeIdx = tQueryMatches[i]; if (tNodeIdx > 0) { - const viewResult = lViewResults[i / 2]; - ngDevMode && assertDefined(viewResult, 'materialized query result should be defined'); - result.push(viewResult as T); + result.push(lViewResults[i / 2] as T); } else { const childQueryIndex = tQueryMatches[i + 1]; diff --git a/packages/core/test/acceptance/query_spec.ts b/packages/core/test/acceptance/query_spec.ts index 9a65692489..8ebe7aba62 100644 --- a/packages/core/test/acceptance/query_spec.ts +++ b/packages/core/test/acceptance/query_spec.ts @@ -1425,6 +1425,78 @@ describe('query logic', () => { expect(fixture.componentInstance.queryResults.last).toBeAnInstanceOf(WithMultiProvider); }); + it('should allow undefined provider value in a [View/Content]Child queries', () => { + @Directive({selector: '[group]'}) + class GroupDir { + } + + @Directive( + {selector: '[undefinedGroup]', providers: [{provide: GroupDir, useValue: undefined}]}) + class UndefinedGroup { + } + + @Component({ + template: ` +
+ +
+
+ ` + }) + class App { + @ViewChild(GroupDir) group !: GroupDir; + } + + TestBed.configureTestingModule( + {declarations: [App, GroupDir, UndefinedGroup], imports: [CommonModule]}); + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + + expect(fixture.componentInstance.group).toBeAnInstanceOf(GroupDir); + }); + + it('should allow null / undefined provider value in a [View/Content]Children queries', () => { + @Directive({selector: '[group]'}) + class GroupDir { + } + + @Directive({selector: '[nullGroup]', providers: [{provide: GroupDir, useValue: null}]}) + class NullGroup { + } + + @Directive( + {selector: '[undefinedGroup]', providers: [{provide: GroupDir, useValue: undefined}]}) + class UndefinedGroup { + } + + @Component({ + template: ` + +
+
+
+ +
+
+ ` + }) + class App { + @ViewChildren(GroupDir) groups !: QueryList; + } + + TestBed.configureTestingModule( + {declarations: [App, GroupDir, NullGroup, UndefinedGroup], imports: [CommonModule]}); + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + + const queryList = fixture.componentInstance.groups; + expect(queryList.length).toBe(3); + + const groups = queryList.toArray(); + expect(groups[0]).toBeNull(); + expect(groups[1]).toBeAnInstanceOf(GroupDir); + expect(groups[2]).toBeUndefined(); + }); });