Using NgRx Component Store to add state to a Directive which then outputs that state to the parent.
import { Directive, Output } from '@angular/core';
import { ComponentStore } from '@ngrx/component-store';
import { interval, Observable, tap } from 'rxjs';
interface MyState {
counter: number;
}
@Directive({
selector: '[myStatefulDirective]',
standalone: true,
})
export class StatefulDirectiveWithOutputsDirective extends ComponentStore<MyState> {
@Output() counterChange = this.select((state) => state.counter);
private readonly incrementCounter = this.updater((state) => ({
...state,
counter: state.counter + 1,
}));
private readonly incrementByInterval = this.effect(
(origin$: Observable<number>) =>
origin$.pipe(tap(() => this.incrementCounter()))
);
constructor() {
super({
counter: 0,
});
this.incrementByInterval(interval(1000));
}
}
And then in your parent component you can use it like this:
import { Component } from '@angular/core';
import { StatefulDirectiveWithOutputsDirective } from './stateful-directive-with-outputs.directive';
@Component({
standalone: true,
selector: 'angular-snippet-examples-root',
template: `
<div myStatefulDirective (counterChange)="counter = $event">
{{ counter }}
</div>
`,
imports: [
StatefulDirectiveWithOutputsDirective,
],
})
export class AppComponent {
counter: number | null = null;
}