2016-06-29 4 views
1

フォームを生成しようとすると無限ループサイクルが発生するため、私のアプリに問題があります。私のフォームはjson(コードの例)に基づいて生成されます。問題は、私が別のステップに行き、フォームに戻るときにだけ発生します。状態が2度目に読み込まれたときにのみ発生するため、この問題の原因はわかりません。前回の状態で作成されたアンギュラウォッチャーは、お互いに重なっている可能性はありますか?角度ダイジェストループ

「フォーム」セクションにフォーム定義があり、各モデル要素を定義する「スキーマ」があり、最後にすべての変数を格納する「モデル」があります。

<schema-form 
    data-name  = "theemployeeform" 
    data-schema = "$ctrl.json.all_fields.schema" 
    data-form  = "$ctrl.json.all_fields.form" 
    data-model = "$ctrl.json.model"> 
</schema-form> 

エラークロムインスペクタを開いてくださいと表示するには: ホーム - >フォーム - >ホーム - あなたは上のあなた自身の時計を作成した場合>フォーム Error: [$rootScope:infdig]

App example on Plunker https://plnkr.co/edit/nkdzwLuEO0RauZT1jpOJ?p=preview

答えて

0

を参照してください。プロパティがスコープにあり、時計が次のように実行されるたびにそのプロパティの値を変更しようとします。

var app = angular.module('test', []) 
app.controller('ctrl', function($scope) { 
    $scope.val = 100; 

    $scope.$watch('val',function(n,o){ 
    $scope.val= $scope.val+1; 
    }) 

}); 

上記の例では、無限ダイジェストループが作成されています。通常、ダイジェストループは最大10回、最低2回実行され、時計のプロパティが変更されているかどうかをチェックするために使用されます...

+0

これは問題です。私はウォッチャーとよくある間違いを犯しましたが、私はイベントを手動で作成しませんでした。同じ例では、$ watchは手動で作成されず、iデータは変更されません。 編集:フォームアイテムコンポーネント内にウォッチャーがありますが、このウォッチは指定されたキーに割り当てられており、そのキーは変更されていません。問題は、状態が最初に読み込まれたときではなく読み込まれたときにのみ表示される理由です。 そのウォッチャーを削除しても、エラーが表示されます。 – piro

0

問題があったのはng-includeですコントローラからの変数に依存します。状態が変更されたng-includeがテンプレートを見つけられなかった場合、index.htmlを読み込もうとしたために問題が発生したためです。そのための解決策は、コンポーネントを手動でテンプレートをコンパイルすることです。コンポーネントは指示としてcompileを持っていないので、$postLink()を変更してコンパイルする必要があります。

https://plnkr.co/edit/N2kUSCljMxaWTS7bZ2uC?p=preview

$element.contents().remove(); 
$templateRequest(templateUrl).then(function(html){ 
    var template = angular.element(html); 
    var compiledContents = $compile(template); 
    compiledContents($scope, function(clone){ 
     $element.append(clone); 
    }); 
}); 

これは、問題を解決します。