fix(ivy): generate empty QueryList for root component content queries (#29514)

In View Engine, we used to generate empty QueryLists for content queries on root
components (though we did not actually support populating these lists). We need
to keep this behavior in Ivy for backwards compatibility. Otherwise, components
that are sometimes used as root will fail if they are relying on content query
results to always be defined.

PR Close #29514
This commit is contained in:
Kara Erickson 2019-03-25 18:39:45 -07:00 committed by Miško Hevery
parent 568140fb03
commit 9724247ad8
2 changed files with 17 additions and 0 deletions

View File

@ -217,6 +217,12 @@ export function createRootComponent<T>(
renderInitialStyles(native, rootTNode.stylingTemplate, componentView[RENDERER]); renderInitialStyles(native, rootTNode.stylingTemplate, componentView[RENDERER]);
} }
// We want to generate an empty QueryList for root content queries for backwards
// compatibility with ViewEngine.
if (componentDef.contentQueries) {
componentDef.contentQueries(RenderFlags.Create, component, rootView.length - 1);
}
return component; return component;
} }

View File

@ -401,6 +401,17 @@ describe('query logic', () => {
}); });
// Some root components may have ContentChildren queries if they are also
// usable as a child component. We should still generate an empty QueryList
// for these queries when they are at root for backwards compatibility with
// ViewEngine.
it('should generate an empty QueryList for root components', () => {
const fixture = TestBed.createComponent(QueryComp);
fixture.detectChanges();
expect(fixture.componentInstance.contentChildren).toBeAnInstanceOf(QueryList);
expect(fixture.componentInstance.contentChildren.length).toBe(0);
});
describe('descendants', () => { describe('descendants', () => {
it('should match directives on elements that used to be wrapped by a required parent in HTML parser', it('should match directives on elements that used to be wrapped by a required parent in HTML parser',