我遇到了一个简单的问题,它有一个简单的解决方案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