Skip to content

feat: expose life cycle hooks to every components #30421

Open
@JulienLecoq

Description

@JulienLecoq

Prerequisites

Describe the Feature Request

I would like to be able to listen to life cycle hooks such as: ionViewWillEnter(), ionViewDidEnter(), and so on, on components that are not pages.

Describe the Use Case

This would for example, allow to set the auto focus to an input directly from the component that contains the input and instead of doing it through the page that access the input inside of a component that is present on the page.

Describe Preferred Solution

Make components methods such as ionViewDidEnter callable by the life cycle system that calls them on pages.

Describe Alternatives

For now, I thought of using this:

import { inject, Injectable } from "@angular/core"
import { NavigationEnd, Router } from "@angular/router"
import { Subscription, filter } from 'rxjs'

type IonViewDidEnterable = {
	ionViewDidEnter(): void
}

@Injectable()
export class LifeCycleService {

	private router = inject(Router)

	private sub: Subscription
	hostComponent!: IonViewDidEnterable

	constructor() {
		const componentUrl = this.router.url

		this.sub = this.router.events
			.pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd))
			.subscribe(() => {
				if (componentUrl !== this.router.url) {
					return
				}

				this.hostComponent.ionViewDidEnter()
			})
	}

	ngOnDestroy() {
		this.sub.unsubscribe()
	}
}

export class MyComponent {
	_ = inject(LifeCycleService).hostComponent = this

	ionViewDidEnter() {
	}
}

But this is not ideal because ionViewDidEnter is called too early doing so. Thus, setting the focus on an input at this time does not work as expected. This could be solved by setting a timeout on the ionViewDidEnter call but that is not ideal.

Related Code

No response

Additional Information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions