2016-04-27 8 views
0

D3とAngularのディレクティブを作成しています。 newValueの再割り当てが表示されないため、なぜ私はInfinite $digest loopエラーが発生し続けるのか分かりません。機能はうまくいきますが、ブラウザの迷惑なエラーが私に掘り下げたいと思っています。ここで

は、ディレクティブのコードです:あなたのコードで

scope.$watch('mode', function (newValue, oldValue) { 
    if (newValue !== oldValue) { 
     scope.triggerAnimation(); 
    } 
}); 

scope.triggerAnimation = function() { 
    var speed = 4; 
    var start = Date.now(); 

    if (scope.mode === null) { 
     d3.timer(function() { 
      var angle = (Date.now() - start) * speed; 
      var transform = function(d, i) { return "rotate(" + angle/50 + "," + centerX + "," + centerY + ")"; }; 

      svg.selectAll(".sidenode, .sidenodeedge").attr("transform", transform); 
      if (scope.mode == null) { 
       return true; 
      } else { 
       return false; 
      } 
     }); 
     scope.mode = 1; 
    } else { 
     scope.mode = null; 
    } 
} 

答えて

0

次があります。

scope.$watch('mode', function (newValue, oldValue) { 
    if (newValue !== oldValue) { 
     scope.triggerAnimation(); 
    } 
}); 

、その後、あなたは常にscope.mode値を変更する関数を実行

scope.triggerAnimation = function() { 
    ... 
    if (scope.mode === null) { 
     // some code here 
     scope.mode = 1; 
    } else { 
     scope.mode = null; 
    } 
} 

常に変更されるようです。scope.modeの値はnullから1までです。そして毎回$digestが呼び出されます。もう一度やり直してください...

+0

ここで私はダイジェストループが繰り返し呼び出される理由を理解しています。ありがとうございました!しかし、 'if else'ループの' mode'値を変更する必要があります。どのように修正するための任意の提案? – catlovespurple

+0

まず、あなたの仕事に$ watchを使用する必要がありますか?この機能を使わないと解決できないのですか?可能であれば、使用することはお勧めできませんので、避けてください。 2番目:あなたが($ watchで)見て、 'else else'で同じ変数を変更する必要がありますか? – MaKCbIMKo

+0

1 $ watchは必須ではありません...私は他のオプションを使うことができますが、その値が変更であるかどうかを監視する必要があります... 2.同じ変数を変更する必要があります – catlovespurple

関連する問題