2013-04-12 24 views
15

私はこれは循環参照がsomehwereだと思いますが、私の人生では私はそれを修正する方法を推測することはできません。RangeError:最大呼び出しスタックサイズを超えました

誰もが考えている?

http://plnkr.co/edit/aNcBcU?p=preview

(例えば)Chromeのデバッグコンソールをチェックし、エラーが表示されます。 問題のある行は、あなたが平等のためではなく、参照用オブジェクトに対して比較しているためです

$scope.$watch("options.map", function (map) { ... }, true); 

答えて

16

経由scope.mapは、コントローラ上で「$観」されている

scope.map = map; 

です。これまでご$watchステートメントを変更します。

$scope.$watch("options.map", function (map) { 
    if (map === undefined) { 
     alert("map has no value"); 
    } else { 
     alert("map is defined"); 
    } 
}); 
+10

ありがとうございます! この回答が必要な場合もあります。私は、これが失敗する理由は、テスト対象のオブジェクトが多くの深いネストプロパティを持つオブジェクトだということでしょうか? このオブジェクトのテストの等価性が原因で、スタックサイズを超過しましたというメッセージが表示されるのはなぜですか? – thrag

8

また、私はこの問題を持っていたし、私が比較されたオブジェクトが循環参照を持っていたことが分かりました。 (JSON.stringify()が「TypeError:JSONに循環構造を変換しようとしました」と試してみました)。

私はオブジェクトを編集して円形の構造を持たないようにしましたが、この問題を修正し、オブジェクトを参照ではなくプロパティ値で比較しました。

5

$ watch関数の3番目のパラメータは、監視対象をどのように比較するかを示します。 は比較のみを参照してください。 Trueは、オブジェクトが循環参照を含む場合、最大スタックサイズを超えているかどうかを比較する再帰的な等価性です。例:

var a = {ref:b}; 
var b = {ref:a}; 
$scope.$watch('b', function(){ 
    //code here will never called, because stack overflow when comparing the object b. 
}, true) 
関連する問題