Carlos Cifuentes
Referencia AngularJS → Angular

$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 · Angular
export 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

¿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