En mi aplicación angular, se me ocurrió una situación en la que solo se debe llamar a ngOnchanges cuando las entradas están vinculadas a cambios. Entonces, ¿hay alguna manera de detener la ejecución de ngOnChanges antes de ngOnInit? Hay alguna manera de lograr esto. Gracias de antemano.
No puede evitar este comportamiento, pero puede:
class Foo implements OnChanges,OnInit,OnDestroy{ onChanges = new Subject<SimpleChanges>(); ngOnInit(){ this.onChanges.subscribe((data:SimpleChanges)=>{ // only when inited }); } ngOnDestroy(){ this.onChanges.complete(); } ngOnChanges(changes:SimpleChanges){ this.onChanges.next(changes); } } class Foo implements OnChanges,OnInit{ initialized=false; ngOnInit(){ // do stuff this.initialized = true; } ngOnChanges(changes:SimpleChanges){ if(this.initialized){ // do stuff when ngOnInit has been called } } }SimpleChanges También puede consultar el método SimpleChange.isFirstChange() :
isFirstChange() : booleanComprueba si el nuevo valor es el primer valor asignado.
class Foo implements OnChanges,OnInit{ @Input() bar:any; ngOnInit(){ // do stuff } ngOnChanges(changes:SimpleChanges){ if(!changes["bar"].isFirstChange()){ // do stuff if this is not the initialization of "bar" } } }Un método que he encontrado que funciona se basa en el hecho de que todos los valores de entrada tienen una propiedad de valor anterior. Si la entrada no se ha configurado previamente, ese valor será CD_INIT_VALUE (como una cadena). Por lo tanto, puede establecer una condición para que su bloque de código en ngOnChanges solo se ejecute si el valor anterior no es CD_INIT_VALUE . Aquí hay un ejemplo para su caso en el que está probando TODOS los valores de entrada:
ngOnChanges(changes: SimpleChanges) { let initialized: boolean = true; for (let prop in changes) { if (changes[prop].previousValue.toString() === 'CD_INIT_VALUE') { initialized = false; //we can break here since if any item is not initialized //we will say the inputs are NOT initialized break; } } if (initialized) { //code you want to execute } }Probablemente haya soluciones más elegantes, pero he encontrado que esto funciona. Probablemente sea demasiado tarde para ayudarlo, pero puede ayudar a otros, ya que cuando busqué en Google encontré esta pregunta. La solución fue algo que descubrí a partir de la depuración.
En caso de que ayude a alguien, aquí hay un ejemplo de cómo implementé la solución isFirstChange() sugerida por @n00dl3 en mi aplicación AngularJS:
this.$onChanges = (changes) => { if (!changes.value.isFirstChange()) { // do stuff } };