【问题标题】:Ionic 2 view updates become slowIonic 2 视图更新变慢
【发布时间】:2016-07-10 18:40:38
【问题描述】:

我正在使用 Ionic 2 构建一个包含计时器的应用程序。 当计时器启动时,一切都很好,并且更新是即时的。但是,在 Ionic View 中,视图更新变得越来越慢。超时设置为 32 毫秒,但在计时器运行 3 分钟后,更新时间大约为 1 秒。我还通过将其作为 Android 应用程序运行来进行测试。更新也变得越来越慢,但不像 Ionic View 那样慢。奇怪的是,当我触摸屏幕时,更新又是即时的,直到我发布它。

我该如何解决这个问题?

我用

启动计时器
this.timer = setInterval(self.getUpdate(self), 32);

getUpdate 函数

getUpdate(self) {
    return () => {
        self.lapTime = TimerPage.formatTime(new Date().getTime() - self.startTime);
        self.cd.markForCheck();
    };
}

在视图中我只是用它来显示时间

<div>{{lapTime}}</div>

【问题讨论】:

    标签: angular ionic2


    【解决方案1】:

    目前尚不清楚是什么造成了麻烦,并且在 5 小时内没有人提出任何建议。

    可能原因:

    Angular 使用 zone.js 表示change detection

    跟踪所有Asynchronous 事件并提供挂钩

    Angular 使用这些钩子来Re-render 视图。

    如果每隔32ms 触发一次,可能会有点重

    Solution:

    在 Angular 的 Github 帐户上提交问题

    像这样在zone.js 的范围之外运行您的setInterval

    import {Component, NgZone} from 'angular2/core';
    
    @Component({})
    export class YourClass{
      constructor(public zone:NgZone){}
    
      setSetInterval(self){ //just a random, normal function
    
        this.zone.runOutsideAngular(
          //anything done here won't trigger a change detection
    
          this.timer = setInterval(self.getUpdate(self), 32); 
        )
      }
    
      getUpdate(self){
        this.zone.run(
          //to reenter the angular's parent zone and trigger a change detection
    
          //put your functions functionality in here
        )
      }
    
    }
    

    【讨论】:

    • 再一次,奇怪的是,一旦我触摸屏幕它就起作用了。我删除了 markForCheck() 调用,它的速度似乎慢得多。之后我也增加了一点间隔。现在它以我可以接受的速度更新。谢谢!
    • 还有一个可能的原因,浏览器可能有什么东西变慢了或者debounce机制for too many iterations,这也只是一个猜测。
    • 可能需要重新考虑这一点。它仍然变得很慢,更新间隔设置为 100 毫秒,视图在运行大约 20 分钟后每 3 秒更新一次。我还在 iPhone 上进行了测试(使用 Ionic View),它似乎不受此影响,它继续全速运行。所以它可能是导致它的Android webview。
    • 您在性能测试之前是否启用了生产模式github.com/angular/angular/issues/6189
    猜你喜欢
    • 2018-03-21
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多