Angular 2+:更改检测,属性更改和查看更新之间的状态

时间:2018-01-07 12:06:00

标签: javascript angular

--------------更新---------------

ChangeDetectorRef.detectChanges()运行组件及其子组件的更改检测器。因此,它可能是一种解决方案。

--------------原始问题----------------

  1. 目的:我希望在组件中更新特定的dom元素后获得通知。

    见下面的图片: (更改文本属性将更改 p 的内容,从而更改dom中 p 元素的高度 enter image description here

  2. 结果: p 的clientHeight仍然是之前的值,而不是最新值。

    预期结果:最新值

  3. 可能的解决方案:

    • 我知道 ngAfterViewChecked 每次都会在更改检测中被触发,它代表视图更新后的状态。
    • 针对此问题的一些解决方案可以强制执行更改检测,如: ApplicationRef.tick() ChangeDetectorRef.detectChanges()(请参阅此处的答案:{ {3}})
  4. 4。我的困惑:

    • 我想要的是组件中特定DOM元素更新后的状态。
    • ngAfterViewChecked 会被每个异步函数(默认情况下)触发,我认为这不合适。
    • ApplicationRef.tick() ChangeDetectorRef.detectChanges()可以强制触发更改检测,该检测将解析整个组件树(从root到子)我觉得这可能太贵了。
    • 我想知道是否有一些功能:

    changeProperty(this.text => {
     this.text = 'A long long text';
     }).then( () => {
       // here is the state after the corresponding text is updated in the view
    })

    或者哪种方法可以解决这个问题? 感谢任何想法!

1 个答案:

答案 0 :(得分:1)

没有这样的东西,我怀疑它会不会出现。

但是,您的特定问题可以以完全不同的方式解决。只要您想控制text / html的呈现方式,就可以更轻松地自己呈现它。

只需设置innerHTML,就会有适当的高度

changeText(para) {
  para.innerHTML = 'long text';
  console.log(para.clientHeight);
}

就是这样。请记住,在分配之前使用innerText或执行某些HTML清理可能更好。