Skip to main content

Handling view and content queries (parent)

Legacy guidance

Legacy guidance — since Angular v19, signal-based viewChild()/contentChild() queries update automatically without the parent flag. This page documents a legacy approach; Zone.js / apps still using the deprecated parent flag may still need it. For new work, prefer the modern approach. See Zoneless & how Zone.js affected change detection for the full picture.

The parent flag existed so that a structural directive could re-run its host component's change detection and keep decorator-based @ViewChild/@ContentChild queries in sync when it inserted or removed views asynchronously. With signal-based queries (viewChild(), contentChild(), since Angular v19) the query re-evaluates on its own, so the flag is no longer needed. parent is deprecated and will be removed; prefer signal queries for new code.

When you still need this

You only need the parent flag if you are on an older setup that combines a @rx-angular/template structural directive (*rxLet, *rxFor, …) with decorator-based view/content queries (@ViewChild, @ContentChild) that must reflect views the directive inserts or removes. On modern Angular, migrate to signal queries and leave the flag off.

import { Component, contentChildren, viewChild, ElementRef } from '@angular/core';

@Component({
selector: 'app-list',
template: `
<div #myDiv *rxLet="state$; let state"></div>
<button (click)="append()">append</button>
`,
})
export class AppListComponent {
readonly myDiv = viewChild<ElementRef<HTMLElement>>('myDiv');

append() {
this.myDiv()?.nativeElement.appendChild(document.createElement('span'));
}
}

Because viewChild()/contentChild() return signals that re-evaluate when the queried views change, the directive does not need to force the parent's change detection, so you can keep parent at its default (false).

The parent input (deprecated)

danger

The parent flag is deprecated and will be removed in a future version once the underlying option is dropped. It is no longer needed with signal-based view queries. This page becomes obsolete the moment the flag is removed.

All @rx-angular/template structural directives (*rxLet, *rxFor, etc.) accept a parent flag. Its default is false. When set to true, the directive runs change detection for its host component whenever it inserts or removes a view, updating that component's view and content queries (and those of its children), at the cost of extra change detection cycles.

<div *rxLet="state$; let state; parent: true"></div>

Leaving parent at its default false (the recommended setting when you use signal queries) avoids those extra cycles.

Setting parent globally

Set the default for every directive with provideRxRenderStrategies, best at root level:

import { provideRxRenderStrategies } from '@rx-angular/cdk/render-strategies';
import { ApplicationConfig } from '@angular/core';

export const appConfig: ApplicationConfig = {
providers: [
provideRxRenderStrategies({
parent: false, // applies to all rx-template structural directives
}),
],
};

For the full picture on the parent option alongside the other rendering controls, see How to tune rendering with strategies.

See also