问题描述
我们有一个带有多个嵌套组件的Angular 7 Web应用程序。我想说的是,最复杂的屏幕可能只有7个组件。 (应用程序外壳,菜单和摘要信息区域,常规数据输入区域,特定数据输入区域,特定数据输入控件/组件等)
在我们的一个屏幕上,我们有一个HTML5画布,我们可以使用该画布允许某人写他们的签名。效果很好。在Android上的Chrome上,它可以很好地运行,直到前几次。但是,当我们浏览记录时,签名绘制功能会变慢。到目前为止,画布上的每个touchmove
事件都需要200毫秒以上的时间来处理(开始于25毫秒左右)。我们只是使用2D绘图上下文通过beginPath(),moveto()/lineto(),closePath()
调用在Canvas上绘制线条。
因此,我通过USB连接到我的Android设备,并使用我的PC的Chrome浏览器功能来记录有人四处移动手指进行签名时发生的情况。我注意到,对于每条记录,Angular都在做越来越多的工作来更新组件。 (将记录的生命看作是建立一堆Angular组件,进行工作,然后在记录完成后将其拆解,然后再返回到应用程序外壳,然后在开始新记录时重新做同样的事情,从而达到记录的生命周期。 )
通过更新组件,看起来越来越多的Angular组件正在检查其HTML可见性要求。因此,过了一会儿,在一个画布*ngIf
内评估了许多touchmove
语句。就像十个组件一样,它们的可见性在手指的一次移动过程中就得到了检查。
我已附上了一个示例touchmove
事件的之前(快速)配置文件统计信息和之后(缓慢)的统计信息。
这可能是泄漏的Angular组件或泄漏的对Observables的订阅可能会复制订阅者或保留旧组件吗?我还没有检查过完整的Windows PC Chrome浏览器是否具有类似的行为,但是我们看不到那里的时间放慢-可能是由于功能更强大的硬件所致。
在哪里我能看到为什么Angular认为在我拆解Canvas touchmove
事件期间-重新创建组件树时,需要验证不断增长的组件列表的可见性要求?
在更新期间为每个touchmove
针对单个touchmove
事件的JavaScript调用树示例
处理第一条记录时,较小的touchmove
调用树
针对慢速情况的探查器统计信息
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)