Angular 2更改检测 - 即使没有任何更改,刷新DOM

时间:2018-06-01 23:32:14

标签: angular performance angular5 angular2-template angular6

我已经构建了一个LIVE in beta的应用程序,现在我正在努力优化它的性能。我有一个案例,其中有一个带图像的表格,我注意到图像一直闪烁,这使我看起来在引擎盖下,我注意到DOM保持清爽。刷新,没有任何变化,但它会一直删除并重新添加自己几次。

我想,我首先会将自己记录到ngOnChanges(_:SimpleChanges)函数中,但是没有任何东西从那里进入console.log,这意味着组件本身没有改变,但出于某种原因,它认为有必要刷新它的DOM。

我只是想知道,我如何调试它并知道是什么导致组件刷新它的DOM?

也许有些工具可以提供帮助吗?我试过Augury,但这似乎没有帮助调试性能问题。

PS。在

中渲染comopnent
if let result = response.result.value as? [String:Any] {
   if let tone = result["document_tone"] as? [String:Any] {
       print(tone)  
      if let cat = tone["tone_categories"] as? [[String:Any]] {
            if let dic = cat[0] as? [String:Any] {
                if let catId = dic["category_id"] as? String {
                  print("catId is %@",catId) 
                }
                if let catName = dic["category_name"] as? String {
                  print("catName is %@",catName ) 
                }
                if let alltones = dic["tones"] as? [[String:Any]] {
                   print("alltones is %@",alltones) 
                    if let innerTone = alltones[0] as? [String:Any] {
                       print(innerTone["tone_name"])
                       print(innerTone["tone_id"])
                    }
                 }
             }
      }
   }
}

模式有点帮助(仍然不明白,为什么它有帮助,如果OnChanges永远不会运行)......但它并没有完全消除随机时刻刷新的DOM。

编辑1

在控制台中刷新DOM,看起来像这样 enter image description here

1 个答案:

答案 0 :(得分:1)

我找到了自己问题的答案。我的问题是使用我的模板中的get方法生成的数组。阿卡。有2个模型:[ParentModel,ChildModel],ParentModel包含一个ChildModel数组。现在我想从ParentModel中只选择那些ChildModel,我做的是

class ParentModel {
    __specificChildren() : IChild[] {}
}

在模板中,我使用了

*ngFor="let child of parentModel.__specificChildren()"

这开始不断刷新。可能是因为某些全局事件触发了相关模型的变化检测,每次检查时都会创建一个具有不同指针的数组,这会告诉Angular某些内容发生了变化,从而触发了变更检测。

无论如何,我如何解决这个问题,而不是在模板中使用最佳的函数,因为我不想在组件中创建一个无用的变量来使事情复杂化,我仍然在组件中创建了辅助变量,从而导致:

<强>组件

public specificChildren: IChild[]

parentDatatabe.subscribe( _parent {
    this.parent = _parent;
    this.specificChildren = _parent.__specificChildren()
})

<强>模板

*ngFor="let child of specificChildren"

因此,当父数据库推送新值时,仅设置新子项。