[解決済み] ng-repeatで関数が返す項目をループスルーするには?
質問
divを繰り返し作成したいのですが、アイテムは関数から返されるオブジェクトです。しかし、次のコードはエラーを報告します。 10 $digest()反復に達した。中止! jsfiddleはこちらです。 http://jsfiddle.net/BraveOstrich/awnqm/
<body ng-app>
<div ng-repeat="entity in getEntities()">
Hello {{entity.id}}!
</div>
</body>
どのように解決するのですか?
短い答え : 本当にそのような関数が必要なのですか? http://jsfiddle.net/awnqm/1/
長い回答
シンプルにするために、あなたのケース(オブジェクトの配列に対するngRepeat)だけを説明します。また、私はいくつかの詳細を省略します。
AngularJSでは
ダーティチェック
を使用しています。アプリケーションが起動されると
$digest
に対して
$rootScope
.
$digest
に対して深さ優先の探索を行います。
スコープの階層
. すべてのスコープはウォッチのリストを持っています。各ウォッチは最後の値(最初は
initWatchVal
). 各スコープですべてのウォッチに対して
$digest
はそれを実行し、現在の値を取得します (
watch.get(scope)
) と比較し
watch.last
. もし現在の値が
watch.last
と等しくない場合 (常に最初の比較のために)
$digest
セット
dirty
を
true
. すべてのスコープが処理されたとき、もし
dirty == true
$digest
から別の深さ優先探索を開始します。
$rootScope
.
$digest
は、dirty == false または traversals の数 == 10 のときに終了します。後者の場合、エラー "10 $digest() iterations reached." がログに記録されます。
では
ngRepeat
. それぞれの
watch.get
を呼び出すと、コレクションからオブジェクトが格納されます。
getEntities
を返す)、キャッシュの追加情報(
HashQueueMap
によって
hashKey
). すべての
watch.get
を呼ぶ
ngRepeat
は、オブジェクトをその
hashKey
をキャッシュから取得しようとします。キャッシュに存在しない場合
ngRepeat
はそれをキャッシュに保存し、新しいスコープを作成し、そこにオブジェクトを置き、DOM要素を作成します。
など
.
では
hashKey
. 通常
hashKey
で生成される一意の番号です。
nextUid()
. しかし、それは
機能
.
hashKey
は生成後、将来の使用のためにオブジェクトに格納されます。
なぜこのサンプルはエラーを発生するのでしょうか?
関数
getEntities()
は常に新しいオブジェクトを含む配列を返します。このオブジェクトは
hashKey
に存在せず
ngRepeat
キャッシュに存在しません。そのため
ngRepeat
にそれぞれ
watch.get
は、そのための新しいスコープを生成し、新しい
{{entity.id}}
. この時計は最初の
watch.get
があります。
watch.last == initWatchVal
. そのため
watch.get() != watch.last
. だから
$digest
は新しいトラバースを開始します。そこで
ngRepeat
は新しいウォッチで新しいスコープを作成します。だから......10回トラバースすると、エラーが発生します。
どのようにそれを修正することができますか
-
新しいオブジェクトをすべての
getEntities()
を呼び出すたびに新しいオブジェクトを作成しないようにします。 -
新しいオブジェクトを作成する必要がある場合には
hashKey
メソッドを追加します。参照 このトピック を参照してください。
AngularJSの内部を知っている人が、私が何か間違っていたら訂正してくれることを願っています。
関連
-
[解決済み] angularのpostリクエストでpreflightのレスポンスがHTTPステータスコード403で不正になる。
-
[解決済み] select 要素のデフォルト値を設定するための ng-option の使用方法
-
[解決済み] Angular JS $locationChangeStart 次の url ルートオブジェクトを取得する
-
[解決済み] AngularJSのng-showとフェードアニメーション
-
[解決済み] エラーです。10回の$digest()反復に達しました。動的なsortby述語で中断!?
-
[解決済み] angularjsでチャートを作成する【終了】。
-
AngularJS がエラー $digest already in progress を報告する
-
[解決済み] AngularJSのng-repeatでキーと値を反復処理する方法は?
-
[解決済み] コントローラでフィルタを使用するには?
-
[解決済み] AngularJSでコントローラを2回実行する場合の対処法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】typeerrorは、未定義のプロパティ'data'を読み取ることができません。
-
[解決済み】Angularjsのng-viewが動作しない。
-
[解決済み] `ui-router` $stateParams vs. $state.params
-
[解決済み] AngularJSのディープリンクとは何ですか?
-
[解決済み] AngularJSで画像を表示する
-
[解決済み] Angularjsを使用してローカルストレージにデータを保存するにはどうすればよいですか?
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み】JSON.stringifyの結果に追加された$$hashKeyは何ですか?
-
[解決済み] ng-model、ng-repeat、およびinputの難しさ