angular angular-directive angular2-directives

angular - Detectar cuándo se modificó el valor de entrada en la directiva.



ng-if (3)

Estoy tratando de detectar cuando el valor de una entrada cambió en una directiva. Tengo la siguiente directiva:

import { ElementRef, Directive, Renderer} from ''@angular/core''; @Directive({ selector: ''[number]'', host: {"(input)": ''onInputChange($event)''} }) export class Number { constructor(private element: ElementRef, private renderer: Renderer){ } onInputChange(event){ console.log(''test''); } }

El problema en esta directiva es que detecta solo cuando hay una entrada y no cuando el valor cambia programáticamente. Uso la forma reactiva y, a veces, establezco el valor con la función patchValue() . ¿Cómo puedo hacer que se active la función de cambio?


Hay una mejor manera de usar este resultado, que se usa, por ejemplo, en el código fuente *ngIf Angular.

Puedes combinar un @Input() con un setter . Cuando cambia la entrada, se vuelve a llamar al setter.

@Input() set numberOfWheels(wheels: number) { if(wheels === 2) { console.log("It''s a bike!"); } else if(wheels === 4) { console.log("It''s a car!"); } else { console.log("I don''t know what it is :("); } }

Puede guardar el valor anterior en la propiedad Directiva para usarlo más adelante y compararlo con el nuevo valor:

private previousValue: any = null; @Input() set myInputName(value: any) { console.log(`Previous value is: ${this.previousValue}`); console.log(`New value is: ${value}`); this.previousValue = value; }


También puede utilizar HostListener. Para obtener más información sobre HostListener, puede ir a través de este enlace . Aquí está el código.

import {Directive, ElementRef, HostListener} from ''@angular/core''; @Directive({ selector: ''[number]'' }) export class NumberDirective { @Input() public number: any; @Input() public input: any; constructor(private el: ElementRef) {} @HostListener(''change'') ngOnChanges() { console.log(''test''); } }


ngOnChanges crear una propiedad de input de input y luego usar el ngOnChanges para indicar cuándo cambia la propiedad de entrada.

@Directive({ selector: ''[number]'' }) export class NumberDirective implements OnChanges { @Input() public number: any; @Input() public input: any; ngOnChanges(changes: SimpleChanges){ if(changes.input){ console.log(''input changed''); } } }

Plunkr