Plunkr below
I'm having a problem with Angular's @Input and inputs : [''].
The problem is that I have a person object. This object contains the id (person.id). Now I need to initialize this in the constructor of the 'parent' page: (note: simplified for plunkr, not actual code but same problem).
import { Component } from '@angular/core';
import { Child } from './child.ts';
@Component({
template: `
<p>current id: {{person.id}}</p>
<child-component [input_id]="person.id"></child-component>
`,
directives: [Child]
})
export class Parent {
public person: any;
constructor() {
//not neccessary here but it is for production
this.person = {id: -5, name: ''}
this.setPerson()
}
setPerson(){
//just to fake a async method (production will be http.get)
setTimeout(() => {
this.person = {id: 3, name: 'test'}
}, 500);
}
}
Where I try to send the person.id to the child-component which looks like this:
import { NavController } from 'ionic-angular/index';
import { Component, OnInit , Input} from "@angular/core";
@Component({
selector: 'child-component',
template: `
<div>child:
<p>Passed id: {{passed_id}}</p>
<p>Some var: {{someVar}}</p>
</div>
`,
inputs: ['passed_id']
})
export class Child implements OnInit {
@Input passed_id: number;
public someVar: number;
constructor(private nav: NavController) {
}
ngOnInit(){
//cant make into ngAfterViewChecked
//because that executes too much and the call here
//will be a heavy http call
this.someVar = this.passed_id;
}
}
The problem here is: at first the binding will happen immediately, setting the passed_id to -5. This also sets someVar to -5.
I want to wait untill the passed_id is changed to 3 (by the Parent.setPerson()) and then make a heavy async (http) call.
Now I know I could use angular's ngAfterViewChecked but this executes a lot since I'm working with different kind of 'tabs' and if possible I'd like a spinner to show in the time that passed_id is -5 till its 3. NgAfterViewChecked would execute this many times, showing the spinner many times.
Just wondering if theres a different way to fix this then a if(!check){while(true){ if(this.passed_id != -5){ this.http.get('..')...; break; }}}