Carlos Cifuentes
Referencia AngularJS → Angular

ng-init en Angular moderno

ng-init desaparece. El estado inicial va en la clase del componente, y los alias de template usan @let.

Antes · AngularJS
<div ng-controller="ReportCtrl as vm"
     ng-init="vm.load(2024); vm.tab = 'summary'">
  <div ng-repeat="row in vm.rows" ng-init="rowTotal = row.qty * row.price">
    {{ rowTotal }}
  </div>
</div>
Después · Angular
export class ReportComponent implements OnInit {
  year = input(2024);
  tab = signal<'summary' | 'detail'>('summary');
  rows = signal<Row[]>([]);

  ngOnInit() {
    this.load(this.year());
  }
}

<!-- template -->
@for (row of rows(); track row.id) {
  @let rowTotal = row.qty * row.price;
  <div>{{ rowTotal }}</div>
}

Qué cambia

  • Los valores iniciales pasan a ser inicializadores de campo; las llamadas que cargan datos van en el constructor, o en ngOnInit cuando dependen de inputs.
  • Los alias creados con ng-init dentro de ng-repeat pasan a ser declaraciones @let (Angular 18.1 en adelante) o computed.
  • Los valores que el servidor escribía en ng-init necesitan otro canal, como una llamada a la API o una etiqueta script con JSON que se lee al arrancar.

Consejo de migración. Busca ng-init en páginas renderizadas por el servidor (JSP, Razor, ERB, Blade). Ahí es donde el backend le pasa datos al frontend, y ese acoplamiento hay que reemplazarlo antes de mover la pantalla.

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