Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

117
Vistas
¿Por qué la variable de referencia de la plantilla no está definida en la llamada al controlador de eventos cuando se usa una directiva estructural personalizada?

Tengo una directiva estructural personalizada en un elemento de entrada. La función de controlador de eventos onBlur del elemento de entrada acepta dos variables de referencia del elemento de plantilla: una es una referencia a su propio NgModel y la otra una referencia a otro NgModel en la plantilla (fuera del elemento con la directiva adjunta).

Después de que se carga la página, la segunda variable de referencia no está definida en la llamada a onBlur, pero si hago clic dentro del segundo elemento de entrada y vuelvo al primer elemento de entrada, la referencia se establece en NgModel, como se esperaba en el evento Blur.

He buscado por todas partes, incluido Stack Overflow, sin suerte por qué ocurre este comportamiento. Descubrí que al usar las variables de referencia de plantilla *ngIf solo funcionarán dentro de la plantilla anidada creada por la directiva estructural, pero este comportamiento es diferente.

Puedo cambiar a usar @ViewChild para las variables de referencia del elemento de plantilla, lo que funciona, pero estoy modificando el código existente que debe permanecer lo más cerca posible del original. Todo funciona como se esperaba sin la directiva estructural personalizada.

Esto ocurre incluso con una directiva simple como se muestra a continuación.

Fragmento de directiva

 @Directive({ selector: '[appMyDirective]' }) export class MyDirective implements OnInit { constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) { ngOnInit() { this.viewContainer.createEmbeddedView(this.templateRef); } }

fragmento de plantilla (HTML)

 <mat-form-field> <input matInput [(ngModel)]="comments" name="comments" #commentsRef="ngModel" (blur)="handleCommentsBlur(commentsRef, titleRef)" *appMyDirective> </mat-form-field> <mat-form-field> <input matInput [(ngModel)]="title" name="title" #titleRef="ngModel"> </mat-form-field>

fragmento de componente TS

 handleCommentsBlur(commentsRef: NgModel, titleRef: NgModel) { // titleRef is undefined after blur event occurs // However when user clicks in the title element and goes back to the comments then the titleRef holds a reference to the NgModel on the next comments onBlur event }
about 4 years ago · Juan Pablo Isaza
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda