Learning Angular 18, I am facing an unexpected behaviour: injection silently failing when an action is triggered by a child component, but ultimately it’s defined in the parent component, where the injection fails.
child.component.ts
<code>@Component({
selector: 'app-child',
standalone: true,
imports: [],
template: `
<button type="button" (click)="action()">Navigate using child</button>
`,
styles: ``
})
export class ChildComponent {
@Input() action: () => void = () => {};
}
</code>
<code>@Component({
selector: 'app-child',
standalone: true,
imports: [],
template: `
<button type="button" (click)="action()">Navigate using child</button>
`,
styles: ``
})
export class ChildComponent {
@Input() action: () => void = () => {};
}
</code>
@Component({
selector: 'app-child',
standalone: true,
imports: [],
template: `
<button type="button" (click)="action()">Navigate using child</button>
`,
styles: ``
})
export class ChildComponent {
@Input() action: () => void = () => {};
}
parent.component.ts
<code>import { Component, inject } from '@angular/core';
import { ChildComponent } from "../child/child.component";
import { Router } from '@angular/router';
@Component({
selector: 'app-parent',
standalone: true,
imports: [ChildComponent],
template: `
<h1>Parent</h1>
<app-child [action]="actionInParent" />
<button type="button" (click)="actionInParent()">Navigate using parent</button>
`,
styles: ``
})
export class ParentComponent {
private router = inject(Router)
actionInParent() {
console.log("Action invoked")
this.router.navigateByUrl('child')
}
}
</code>
<code>import { Component, inject } from '@angular/core';
import { ChildComponent } from "../child/child.component";
import { Router } from '@angular/router';
@Component({
selector: 'app-parent',
standalone: true,
imports: [ChildComponent],
template: `
<h1>Parent</h1>
<app-child [action]="actionInParent" />
<button type="button" (click)="actionInParent()">Navigate using parent</button>
`,
styles: ``
})
export class ParentComponent {
private router = inject(Router)
actionInParent() {
console.log("Action invoked")
this.router.navigateByUrl('child')
}
}
</code>
import { Component, inject } from '@angular/core';
import { ChildComponent } from "../child/child.component";
import { Router } from '@angular/router';
@Component({
selector: 'app-parent',
standalone: true,
imports: [ChildComponent],
template: `
<h1>Parent</h1>
<app-child [action]="actionInParent" />
<button type="button" (click)="actionInParent()">Navigate using parent</button>
`,
styles: ``
})
export class ParentComponent {
private router = inject(Router)
actionInParent() {
console.log("Action invoked")
this.router.navigateByUrl('child')
}
}
If I press “Navigate using parent”, navigation works. If I press “Navigate using child”, navigation fails (in the console I see an error triggered by router being undefined).