Skip to content

Commit 409860a

Browse files
karabenlesh
authored andcommitted
fix(ivy): queries should be restored when view changes (angular#25415)
PR Close angular#25415
1 parent 2b128a4 commit 409860a

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

packages/core/src/render3/instructions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ export function enterView(newView: LViewData, host: LElementNode | LViewNode | n
274274
}
275275

276276
viewData = contextViewData = newView;
277+
oldView && (oldView[QUERIES] = currentQueries);
277278
currentQueries = newView && newView[QUERIES];
278279

279280
return oldView;

packages/core/test/bundling/hello_world/bundle.golden_symbols.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@
6262
{
6363
"name": "PublicFeature"
6464
},
65+
{
66+
"name": "QUERIES"
67+
},
6568
{
6669
"name": "RENDERER"
6770
},

packages/core/test/render3/query_spec.ts

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {ElementRef, TemplateRef, ViewContainerRef} from '@angular/core';
1111

1212
import {EventEmitter} from '../..';
1313
import {QUERY_READ_CONTAINER_REF, QUERY_READ_ELEMENT_REF, QUERY_READ_FROM_NODE, QUERY_READ_TEMPLATE_REF, getOrCreateNodeInjectorForNode, getOrCreateTemplateRef} from '../../src/render3/di';
14-
import {AttributeMarker, QueryList, defineComponent, defineDirective, detectChanges, injectViewContainerRef} from '../../src/render3/index';
14+
import {AttributeMarker, QueryList, defineComponent, defineDirective, detectChanges, injectTemplateRef, injectViewContainerRef} from '../../src/render3/index';
1515
import {bind, container, containerRefreshEnd, containerRefreshStart, element, elementContainerEnd, elementContainerStart, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, load, loadDirective, loadElement, loadQueryList, registerContentQuery} from '../../src/render3/instructions';
1616
import {RenderFlags} from '../../src/render3/interfaces/definition';
1717
import {query, queryRefresh} from '../../src/render3/query';
@@ -1780,6 +1780,52 @@ describe('query', () => {
17801780
});
17811781
});
17821782

1783+
it('should restore queries if view changes', () => {
1784+
class SomeDir {
1785+
constructor(public vcr: ViewContainerRef, public temp: TemplateRef<any>) {
1786+
this.vcr.createEmbeddedView(this.temp);
1787+
}
1788+
1789+
static ngDirectiveDef = defineDirective({
1790+
type: SomeDir,
1791+
selectors: [['', 'someDir', '']],
1792+
factory: () => new SomeDir(injectViewContainerRef(), injectTemplateRef())
1793+
});
1794+
}
1795+
1796+
function template(rf: RenderFlags, ctx: any) {
1797+
if (rf & RenderFlags.Create) {
1798+
element(0, 'div');
1799+
}
1800+
}
1801+
1802+
/**
1803+
* <div *someDir></div>
1804+
* <div #foo></div>
1805+
*/
1806+
const AppComponent = createComponent(
1807+
'app',
1808+
function(rf: RenderFlags, ctx: any) {
1809+
if (rf & RenderFlags.Create) {
1810+
container(1, template, null, [AttributeMarker.SelectOnly, 'someDir']);
1811+
element(2, 'div', null, ['foo', '']);
1812+
}
1813+
},
1814+
[SomeDir], [],
1815+
function(rf: RenderFlags, ctx: any) {
1816+
if (rf & RenderFlags.Create) {
1817+
query(0, ['foo'], true, QUERY_READ_FROM_NODE);
1818+
}
1819+
if (rf & RenderFlags.Update) {
1820+
let tmp: any;
1821+
queryRefresh(tmp = load<QueryList<any>>(0)) && (ctx.query = tmp as QueryList<any>);
1822+
}
1823+
});
1824+
1825+
const fixture = new ComponentFixture(AppComponent);
1826+
expect(fixture.component.query.length).toBe(1);
1827+
});
1828+
17831829
describe('content', () => {
17841830
let withContentInstance: WithContentDirective|null;
17851831
let shallowCompInstance: ShallowComp|null;

0 commit comments

Comments
 (0)