我遇到了一個簡單的問題,它有一個簡單的解決方案setTimeout(...,0)
。Angular 4 - 什麼是「等待手術」的正確方法?
望着這個簡單的代碼:
@Component({
selector: 'my-app',
template: `
<div>
<input value='Fill Data' type='button' (click)='fill()'/>
<span *ngFor="let o of Items" class='mySpan'>Span To Detect<br></span>
</div>
`,
})
export class App {
Items:Array<number> = new Array<number>();
fill()
{
this.Items = [1,2,3,4,5,6,7,8,9,10]
this.analyzeDom(); //this has to run here
}
analyzeDom()
{
alert($("div .mySpan").length) // "0"
//BUT if I set this hacky trick , it works
// setTimeout(function(){ alert($("div .mySpan").length)},0) // "10"
}
}
如果我按一下按鈕,警報顯示爲 「0」。我明白爲什麼會發生。這是因爲Angular沒有完成它的週期來實際填充ngFor
。
但是 - 使用setTimeout(..,0)
做這個詭計對我來說似乎有點冒失,我寧願不相信它。
問:
什麼是正確的方式在角 「等待作業」? (這樣我會看到「10」)?
通過使用[生命週期鉤(https://angular.io/docs/ts/latest/guide/ lifecycle-hooks.html) - 'ngOnInit'或者不同的'ngDoCheck'方法 – mhodges
@mhodges但是點擊按鈕可以點擊這個按鈕,並且在這些鉤子已經發生之後可以點擊這個按鈕 –
你想要的原因是什麼使其同步和延遲功能,直到DOM將被更新?是不是更好地從當前模型讀取長度,而不是像'alert(this.Items.length)'這樣的DOM? – Kuba