当dom改变时,Angular2 setinterval被阻塞

时间:2018-01-09 13:44:54

标签: javascript angular performance dom setinterval

我有一个基本的Javascript / JQuery应用程序,我现在转移到Angular2,使用material.angular.io作为我的UI。

在旧版本中,当我使用“setInterval(func,200);”时每隔200ms查询一次服务器,它每200ms调用一次,即使在使用JQuery的append(内容)或html(内容)函数添加DOM元素时也是如此。

现在在Angular2中,虽然DOM使用* ngFor更改并且更改很大(从服务器获取~200行并将其显示为具有材质组件(如切换按钮)的表行),所有内容都会冻结约1秒钟。服务器的日志告诉我,在再次恢复每200ms之前,呼叫确实停止了大约1秒。 但是当我将DOM元素添加到较小的组中时(即每200毫秒有10个项目),那么一切都很好。

当我使用F11切换全屏时,当浏览器重新绘制布局以匹配新窗口大小时,也会发生这种情况。

使用Chrome的调试控制台,我可以看到“Timer Fired(zone.js:2087)”显示“Recurring handler take 731.18 ms”警告。我不确定问题是因为我的代码还是因为它是一个material.io问题,但我认为Angular的setInterval与普通的JavaScript setInterval不同?

以下是相关代码:

15:40:25.229 stat.service.ts:108 200
15:40:25.430 stat.service.ts:108 201
15:40:25.630 stat.service.ts:108 201
15:40:25.831 stat.service.ts:108 201
15:40:26.031 stat.service.ts:108 200
15:40:26.235 stat.service.ts:108 203
15:40:26.435 stat.service.ts:108 201
15:40:26.636 stat.service.ts:108 201
15:40:26.838 stat.service.ts:108 202
15:40:27.039 stat.service.ts:108 201
15:40:27.895 stat.service.ts:108 856 // WHEN THE COMPONENT LOADS
15:40:28.200 stat.service.ts:108 305
15:40:28.442 stat.service.ts:108 242
15:40:28.679 stat.service.ts:108 237
15:40:28.901 stat.service.ts:108 221
15:40:29.131 stat.service.ts:108 231
15:40:29.363 stat.service.ts:108 231

debug

来自服务器的日志显示上次查询的时间:

  private void uiBind() {
    webView = (WebView) findViewById(R.id.web_view);
    webView.setWebViewClient(new FileWebView());
    webView.getSettings().setLoadsImagesAutomatically(true);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setAllowFileAccess(true);

    if (mode == Constant.PDF_FILE) {
        webView.loadUrl("http://docs.google.com/gview?embedded=true&url="
                + "http://www.5gamericas.org/files/2714/1471/2645/4G_Americas_Recommendations_on_5G_Requirements_and_Solutions_10_14_2014-FINALx.pdf");

    } else if (mode == Constant.DOC_FILE) {
        webView.loadUrl("http://docs.google.com/gview?embedded=true&url="
                + "http://ijsetr.com/uploads/4256135G%20Mobile%20Wireless%20Technology.docx");

    } else if (mode == Constant.EXCEL_FILE) {
        webView.loadUrl("http://docs.google.com/gview?embedded=true&url="
                + "http://download.microsoft.com/download/1/4/E/14EDED28-6C58-4055-A65C-23B4DA81C4DE/Financial%20Sample.xlsx");
    }
}

public class FileWebView extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // TODO Auto-generated method stub
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        // TODO Auto-generated method stub
        super.onPageFinished(view, url);

    }
}

1 个答案:

答案 0 :(得分:0)

这可能是Angular中ChangeDetection的问题。当您更改对象时,它会渲染整个对象。尝试在组件中实现ChangeDetectionStrategy,看看是否有任何改进。您的组件代码如下所示:

@Component({
  selector: "your-comp",
  templateUrl: "./your.component.html",
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class YourComponent{
  constructor(private cdr: ChangeDetectorRef) {}

 // this.cdr.markForCheck(); use code for change on DOM when you get data in observable
}

希望它会有所帮助