test(ivy): add test for <ng-container> and shallow queries (#25379)
PR Close #25379
This commit is contained in:
parent
6c4da9dcd3
commit
9c92a6fc7a
|
@ -401,6 +401,73 @@ describe('query', () => {
|
||||||
expect(qList.first.nativeElement).toEqual(elToQuery);
|
expect(qList.first.nativeElement).toEqual(elToQuery);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BREAKING CHANGE: this tests asserts different behaviour as compared to Renderer2 when it
|
||||||
|
* comes to descendants: false option and <ng-container>.
|
||||||
|
*
|
||||||
|
* Previous behaviour: queries with descendants: false would descend into <ng-container>.
|
||||||
|
* New behaviour: queries with descendants: false would NOT descend into <ng-container>.
|
||||||
|
*
|
||||||
|
* Reasoning: the Renderer2 behaviour is inconsistent and hard to explain to users when it
|
||||||
|
* comes to descendants: false interpretation (see
|
||||||
|
* https://github.com/angular/angular/issues/14769#issuecomment-356609267) so we are changing
|
||||||
|
* it in ngIvy.
|
||||||
|
*
|
||||||
|
* In ngIvy implementation queries with the descendants: false option are interpreted as
|
||||||
|
* "don't descend" into children of a given element when looking for matches. In other words
|
||||||
|
* only direct children of a given component / directive are checked for matches. This applies
|
||||||
|
* to both regular elements (ex. <div>) and grouping elements (<ng-container>,
|
||||||
|
* <ng-template>)).
|
||||||
|
*
|
||||||
|
* Grouping elements (<ng-container>, <ng-template>) are treated as regular elements since we
|
||||||
|
* can query for <ng-container> and <ng-template>, so they behave like regular elements from
|
||||||
|
* this point of view.
|
||||||
|
*/
|
||||||
|
it('should not descend into <ng-container> when descendants: false', () => {
|
||||||
|
let elToQuery;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <ng-container>
|
||||||
|
* <div #foo></div>
|
||||||
|
* </ng-container>
|
||||||
|
* class Cmpt {
|
||||||
|
* @ViewChildren('foo') deep;
|
||||||
|
* @ViewChildren('foo', {descendants: false}) shallow;
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
const Cmpt = createComponent(
|
||||||
|
'cmpt',
|
||||||
|
function(rf: RenderFlags, ctx: any) {
|
||||||
|
if (rf & RenderFlags.Create) {
|
||||||
|
elementContainerStart(2);
|
||||||
|
{
|
||||||
|
element(3, 'div', null, ['foo', '']);
|
||||||
|
elToQuery = loadElement(3).native;
|
||||||
|
}
|
||||||
|
elementContainerEnd();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[], [],
|
||||||
|
function(rf: RenderFlags, ctx: any) {
|
||||||
|
if (rf & RenderFlags.Create) {
|
||||||
|
query(0, ['foo'], true, QUERY_READ_ELEMENT_REF);
|
||||||
|
query(1, ['foo'], false, QUERY_READ_ELEMENT_REF);
|
||||||
|
}
|
||||||
|
if (rf & RenderFlags.Update) {
|
||||||
|
let tmp: any;
|
||||||
|
queryRefresh(tmp = load<QueryList<any>>(0)) && (ctx.deep = tmp as QueryList<any>);
|
||||||
|
queryRefresh(tmp = load<QueryList<any>>(1)) &&
|
||||||
|
(ctx.shallow = tmp as QueryList<any>);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const fixture = new ComponentFixture(Cmpt);
|
||||||
|
const deepQList = fixture.component.deep;
|
||||||
|
const shallowQList = fixture.component.shallow;
|
||||||
|
expect(deepQList.length).toBe(1);
|
||||||
|
expect(shallowQList.length).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
it('should read ViewContainerRef from element nodes when explicitly asked for', () => {
|
it('should read ViewContainerRef from element nodes when explicitly asked for', () => {
|
||||||
/**
|
/**
|
||||||
* <div #foo></div>
|
* <div #foo></div>
|
||||||
|
|
Loading…
Reference in New Issue