$onInit / $onChanges / $onDestroy / $postLink en Angular moderno
Los hooks de los componentes de AngularJS tienen sucesores directos: ngOnInit, ngOnChanges y ngOnDestroy. Con signal inputs, la mayor parte de ese código pasa a computed, effect y DestroyRef.
Antes · AngularJS
app.component('userChart', {
bindings: { userId: '<' },
controller: function ($element, ChartService) {
var ctrl = this, chart;
ctrl.$onInit = function () { ctrl.ready = true; };
ctrl.$onChanges = function (changes) {
if (changes.userId) { ctrl.load(changes.userId.currentValue); }
};
ctrl.$postLink = function () { chart = ChartService.create($element[0]); };
ctrl.$onDestroy = function () { chart.destroy(); };
}
});Después · Angularexport class UserChartComponent {
private host = inject<ElementRef<HTMLElement>>(ElementRef);
private charts = inject(ChartService);
private destroyRef = inject(DestroyRef);
userId = input.required<string>();
constructor() {
effect(() => this.load(this.userId())); // $onChanges
afterNextRender(() => { // $postLink
const chart = this.charts.create(this.host.nativeElement);
this.destroyRef.onDestroy(() => chart.destroy()); // $onDestroy
});
}
private load(id: string) { /* request the chart data */ }
}Qué cambia
- $onInit pasa a ser ngOnInit, o inicializadores de campo cuando el código no lee un input.
- $onChanges pasa a ser computed o effect sobre signal inputs; ngOnChanges con SimpleChanges sigue funcionando para inputs con decorador.
- $postLink pasa a ser afterNextRender, que corre una vez en el navegador después de renderizar el componente; $onDestroy pasa a ser ngOnDestroy o DestroyRef.onDestroy.
Consejo de migración. La mayoría de los $onChanges solo recalculan un valor a partir de un binding. Convierte esos primero a computed, y deja effect para los pocos que disparan una petición o tocan el DOM.
Relacionado
- $scope.$on('$destroy')
- require (parent controllers)
- isolate scope (scope: {})
- lazy loaded states (ocLazyLoad, future states)
¿Planeas una migración o una plataforma de microfrontends?
En una llamada de 20 minutos me cuentas tu situación y te digo cómo la abordaría. Si todavía no vale la pena, también te lo digo.
Escríbeme por LinkedIn