2015-10-22 19 views
8

Angular2アプリでFirefoxで無限変化検出ループを引き起こす可能性のあるトリガーがランダムに見つかりました。FirefoxのAngular2変化検出無限ループ

私はPlunker上のものを複製しています:http://plnkr.co/edit/VTS89eJkePLrJjuoDzOK

ScrollToFixedプラグインは、いくつかの基本的なDOM操作を行い、いくつかのスタイルが適用されます。しかし、 "Main"セクションと "Sidebar"セクションをスクロールすると、doCheckが無限に呼び出されます。

Googleマップ内のマーカーをトリガしてアニメーションを開始することで、Firefoxで無限ループを引き起こすこともできました。

IE、Safari、またはChromeでは無限ループは発生しません。これがAngular2またはFirefoxの問題であるかどうかはわかりませんが、問題の原因を見つけることはできません。

app.ts

import {Component, View, bootstrap, DoCheck} from 'angular2/angular2'; 


@Component({ 
    selector: 'my-app' 
}) 
@View({ 
    templateUrl: 'template.html' 
}) 
export class App implements DoCheck{ 
    constructor() 
    { 

     $('#sidebar').scrollToFixed(); 
    } 

    doCheck(){ 
     console.log('do check') 
    } 

} 

bootstrap(App); 

template.html

<div id="main">Main 
</div> 

<div id="sidebar">Sidebar 
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> 
Sidebar bottom 
</div> 

style.cssに

* { 
    box-sizing:border-box; 
} 

#main { 
    float: left; 
    width: 66.66667%; 
    height:10000px; 
} 

#sidebar { 
    overflow:scroll; 
    float: left; 
    width: 33.33333%; 
    background-color: #f9f8f9; 
    height:200px; 
} 

index.htmlを

<!DOCTYPE html> 
<html> 

    <head> 
    <title>angular2 playground</title> 
    <link href="style.css" rel="stylesheet" /> 
    <script src="https://code.angularjs.org/tools/traceur-runtime.js"></script> 
    <script src="https://code.angularjs.org/tools/system.js"></script> 
    <script src="https://code.angularjs.org/tools/typescript.js"></script> 
    <script src="config.js"></script> 
    <script src="https://code.angularjs.org/2.0.0-alpha.44/angular2.min.js"></script> 
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
<script src="https://rawgit.com/bigspotteddog/ScrollToFixed/master/jquery-scrolltofixed.js"></script> 
    <script> 
    System.import('app') 
     .catch(console.error.bind(console)); 
    </script> 
    </head> 

    <body> 
    <my-app> 
    loading... 
    </my-app> 
    </body> 

</html> 

答えて

0

私はこれが唯一のFirefoxでなぜ起こるかわからない、それが無限ループを生成しますが、スローされたエラーは、サイドバーが作成される前に、あなたが$('#sidebar').scrollToFixed();を適用しようとしていることを示している理由。既定では、コンストラクタ内のAngularでは、DOM要素はまだレンダリングされていません。サイドバーは、AngularでDOMを初期化した後にのみ使用できます。あなたはngAfterViewInitにあなたのコードを置くことができ、それは動作します。

詳細はhttps://angular.io/guide/lifecycle-hooksをご覧ください。

関連する問題