Carlos Cifuentes
Referencia AngularJS → Angular

nested ng-controller and scope inheritance en Angular moderno

Los controladores anidados compartían datos por herencia de scope. Los componentes no comparten nada de forma implícita: el padre le pasa cada valor al hijo por un input.

Antes · AngularJS
<div ng-controller="OrderCtrl">
  <h2>{{ order.number }}</h2>
  <div ng-controller="LinesCtrl">
    <!-- order comes from the parent scope -->
    <p ng-repeat="line in order.lines">{{ line.sku }}</p>
    <!-- writes to the child scope only -->
    <input ng-model="filter">
  </div>
</div>
Después · Angular
@Component({
  selector: 'app-order',
  imports: [OrderLinesComponent],
  template: `
    <h2>{{ order().number }}</h2>
    <app-order-lines [lines]="order().lines" [(filter)]="filter" />
  `,
})
export class OrderComponent {
  order = input.required<Order>();
  filter = signal('');
}

// OrderLinesComponent
lines = input.required<Line[]>();
filter = model('');

Qué cambia

  • El template de un hijo no puede leer propiedades del padre; cada valor que necesita se declara como input.
  • El problema de shadowing, donde escribir un primitivo en un scope hijo creaba una copia sin avisar, desaparece; usa model() cuando el hijo debe escribir de vuelta.
  • Las referencias a $parent pasan a ser inputs, outputs o un servicio inyectado.

Consejo de migración. Pasa los controladores a la sintaxis controllerAs antes de migrar. Así cada referencia lleva un prefijo, y los nombres que pertenecen a un controlador externo pasan a ser la lista de inputs del nuevo componente hijo.

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