【发布时间】:2017-10-02 12:01:05
【问题描述】:
我有一个非常基本的 angular2 Web 应用程序。我想知道可以添加代码以编辑 DOM 的正确位置/挂钩。
当我尝试将其放入 ngAfterViewInit 时,我看到以下错误
ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked.
我发现让它工作的唯一方法是像这样在超时中包装我的代码
setTimeout(_ => {
.... code comes here ...
})
这似乎不是正确的方法。有什么想法吗?
组件 JS 代码
export class LandingPageComponent implements OnInit {
techImageSize = "100"
constructor() { }
ngOnInit() {
}
ngAfterViewInit(){
setTimeout(_ => {
var w = $("[data-container=tech-images]").width();
this.techImageSize = Math.floor(w / 4) + "";
})
}
}
相关模板代码:
<div class="col-md-5" data-container="tech-images">
<div class="" style='overflow: auto'>
<tech-image image='heroku-logo.png' [size]="techImageSize"></tech-image>
<tech-image image='surge-logo.svg' [size]="techImageSize"></tech-image>
<tech-image image='swift-logo.png' [size]="techImageSize"></tech-image>
<tech-image image='heroku-logo.png' [size]="techImageSize"></tech-image>
</div>
</div>
【问题讨论】:
-
你的代码是...?
-
@smnbbrv 我更新了帖子,谢谢!
-
我们也能看到你的组件模板 HTML 吗?至少对于相关的
data-container="tech-images"元素。我猜它的一个维度被设置为this.techImageSize,但这是在更改检测周期中发生的。 -
现在就来看看吧 :)
-
@PrakashRaman,JackKoppa 很好地解释了为什么你会收到这个错误,这就是为什么 setTimeout 是必要的——以避免弄乱更改检测。除此之外,请注意在 Angular 中强烈建议不要对 DOM 进行任何直接操作(尤其是使用 jQuery)。
标签: angular