1. ホーム
  2. angularjs

[解決済み] AngularJS 。scope.apply()呼び出し時の$digest already in progressエラーを防ぐ。

2022-02-19 06:39:59

質問

angularでアプリケーションを構築してから、手動で自分のスコープにページを更新する必要があると感じることが多くなりました。

私が知る限り、これを行う唯一の方法は $apply() をコントローラやディレクティブのスコープから取得することができます。この場合の問題点は、コンソールに :

エラー: $digest はすでに進行中です。

このエラーを回避する方法、または同じことを別の方法で実現する方法をご存知の方はいらっしゃいますか?

解決方法は?

<ブロッククオート

このパターンは使用しないでください - これは結局、解決するよりも多くのエラーを引き起こすことになります。何かを解決したと思っても、解決していないのです。

を確認することができます。 $digest をチェックすることで、すでに進行中であることを確認します。 $scope.$$phase .

if(!$scope.$$phase) {
  //$digest or $apply
}

$scope.$$phase を返します。 "$digest" または "$apply" があれば $digest または $apply が進行中であることを示します。これらの状態の違いは、以下の通りだと思います。 $digest は現在のスコープとその子スコープの時計を処理することになり $apply は、すべてのスコープのウォッチャーを処理します。

dnc253 さんのご指摘の通り、もしあなたが $digest または $apply をよく見かけますが、やり方が間違っているのかもしれません。私は一般的に、Angularの範囲外で発生したDOMイベントの結果、スコープの状態を更新する必要があるときに、消化する必要があると感じています。例えば、twitterのブートストラップ・モーダルが非表示になったときです。時には、DOMイベントが $digest が進行中である場合とそうでない場合があります。だから、このチェックを使うのです。

もっといい方法を知っている人がいたら教えてほしいです。


コメントより by @anddoutoi

angular.js アンチパターン

  1. しないでください if (!$scope.$$phase) $scope.$apply() を意味します。 $scope.$apply() は、コールスタックの十分な高さにありません。