我遇到了ngOnChange
的问题。我有以下组件:
@Component({
selector:'user-table',
template: `...`,
})
export class UserTable implements OnChanges{
@Input() users: User[];
years:string[];
constructor(private _usersCollection:UsersCollection){
}
ngOnChanges(){
if (this.users.length)
{this.years =this._usersCollection.createYearsArray(this.users)}
}
}
但是,如果条件只被检查一次 - 当尚未从服务器获取this.users
时,因此其长度为0.我如何找到处理这种异步输入的解决方案?
更新数组,就像我设置以下日志一样:
console.log('ON FIRST INIT' , this.programs);
this.years = this._usersCollection.createYearsArray();
console.log(this.years);
setInterval(()=>{
console.log('IN INTERVVAL' , this.programs);
},1000);
控制台输出是:
ON FIRST INIT []
UsersTable.component.ts:21 []
UsersTable.component.ts:23 IN INTERVVAL [Object, Object, Object, Object]
答案 0 :(得分:8)
如果在输入属性发生更改时不需要执行任何逻辑(例如,您只在模板绑定中使用该属性),则无需执行任何操作。 Angular会自动将新值从父级传播到输入属性。
如果要在输入属性更改时执行某些组件逻辑,请使用ngOnChanges()
,只要有任何组件输入属性发生更改,就会调用它。
由于Angular使用===
来检测更改(嗯,NaN
也有一些特殊处理),这意味着
myArray = someNewArray;
ngOnChanges()
。例如,对于诸如myArray[0].name = newName;
之类的更改,不会调用ngOnChanges()
。myNumber = 5;
或myNumber = newNumber
; 另一个选择是使用ngDoCheck()
实现您自己的更改检测逻辑。有关示例,请参阅this answer。每次检查组件或指令的输入属性时,都会调用该生命周期钩子。通过执行自定义检查,使用它来扩展更改检测“ - 来自lifecyle hooks.md
答案 1 :(得分:0)
ngOnChanges()
时会调用 users
。您只需要确保在父组件中为新数组分配users
,而不是填充现有数组。否则,角度变化检测不会识别出变化。