27

私はAngularを初めて使用し、IEに関連する問題で立ち往生しています。

これが私が得ているIEエラーです。

Webpage error details

User Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Timestamp: Thu, 13 Dec 2012 04:00:46 UTC


Message: 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["fn: function $locationWatch() {\n      var oldUrl = $browser.url();\n\n      if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t  if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t      defaultPrevented) {\n\t    $location.$$parse(oldUrl);\n\t  } else {\n\t    $browser.url($location.absUrl(), $location.$$replace);\n\t    $location.$$replace = false;\n\t    afterLocationChange(oldUrl);\n\t  }\n\t});\n      }\n\n      return changeCounter;\n    }; newVal: 7; oldVal: 6"],["fn: function $locationWatch() {\n      var oldUrl = $browser.url();\n\n      if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t  if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t      defaultPrevented) {\n\t    $location.$$parse(oldUrl);\n\t  } else {\n\t    $browser.url($location.absUrl(), $location.$$replace);\n\t    $location.$$replace = false;\n\t    afterLocationChange(oldUrl);\n\t  }\n\t});\n      }\n\n      return changeCounter;\n    }; newVal: 8; oldVal: 7"],["fn: function $locationWatch() {\n      var oldUrl = $browser.url();\n\n      if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t  if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t      defaultPrevented) {\n\t    $location.$$parse(oldUrl);\n\t  } else {\n\t    $browser.url($location.absUrl(), $location.$$replace);\n\t    $location.$$replace = false;\n\t    afterLocationChange(oldUrl);\n\t  }\n\t});\n      }\n\n      return changeCounter;\n    }; newVal: 9; oldVal: 8"],["fn: function $locationWatch() {\n      var oldUrl = $browser.url();\n\n      if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t  if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t      defaultPrevented) {\n\t    $location.$$parse(oldUrl);\n\t  } else {\n\t    $browser.url($location.absUrl(), $location.$$replace);\n\t    $location.$$replace = false;\n\t    afterLocationChange(oldUrl);\n\t  }\n\t});\n      }\n\n      return changeCounter;\n    }; newVal: 10; oldVal: 9"],["fn: function $locationWatch() {\n      var oldUrl = $browser.url();\n\n      if (!changeCounter || oldUrl != $location.absUrl()) {\n\tchangeCounter++;\n\t$rootScope.$evalAsync(function() {\n\t  if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n\t      defaultPrevented) {\n\t    $location.$$parse(oldUrl);\n\t  } else {\n\t    $browser.url($location.absUrl(), $location.$$replace);\n\t    $location.$$replace = false;\n\t    afterLocationChange(oldUrl);\n\t  }\n\t});\n      }\n\n      return changeCounter;\n    }; newVal: 11; oldVal: 10"]]
Line: 7859
Char: 6
Code: 0
URI: http://localhost:8080/__assets__/lib/angular/angular.js

これは、IE8とIE9以外のブラウザでは発生しません。

ロケーションフィルターを含むコンテンツフィルターオブジェクトを見ている時計があります。

これに関する私の質問は、IE以外のブラウザではなぜ発生しないのか、そしてこれを取り除くために何をすべきかということです。前もって感謝します。

4

7 に答える 7

30

TiagoRoldãoは間違いなく正しいです。私はまったく同じ問題を抱えていました。デバッグ後、私は自分のコードで自分が持っていることに気づきました

location.hash = "#/app/" + id;

これにより、無限ループの問題が発生します。いくつかの調査の後、私はこれを見つけました

$location.path("/apps/" + id);

これは私の問題を完全に解決します。

于 2013-08-08T23:55:27.000 に答える
22

私は同じように見えるエラーで同じ問題を抱えていました。Chrome \ FFは正常に機能しましたが、IEは失敗しました。アプリ内のいくつかのリンクをクリックしましたが、このエラーが発生する場合と発生しない場合があります。

1)私の見解では、次のようなリンクはほとんどありませんでした。

<a href="#" ng-click="addIP(ip)">Add some IP</a>

2)次のようにIpRangesコレクションに新しいオブジェクトを追加したリンクのハンドラーをクリックします。

$scope.IpRanges.push(ip);

3)コレクション自体がng-repeatによってビューにバインドされていて、どういうわけかIEがこの状況をうまく処理できないと思いました-おそらく、イベントのバインド/追加/適用の順序が間違っていなかったか、そうでなければ...リンクをクリックした後も#記号がURLに追加され、時々点滅し、エラーが発生しました。そこで、href属性を削除すると、すべてが正常に機能しました。

<a href="" ng-click="addCurrentIP()">Add as allowed IP</a>

おそらく、同様の状況ではスパンまたはdivを使用する方がよいでしょう。

于 2013-08-07T14:15:39.993 に答える
17

$ window.history.back()を呼び出すときに(特にWindows Phoneで)、IE9、IE10でAngularJSv1.2.13を使用して同じ問題が発生しました。

根本的な原因は、IEの$ window.history.back()が$ locationWatch()が起動される直前にhrefを変更するため、oldUrlに新しいURLが含まれ、Angularが無限の$digestにスローされることです。

差し迫った回避策は、$ window.history.back()の呼び出しを次のように置き換えることです。

setTimeout(function () 
{
    $window.history.back();
}, 0);
于 2014-05-28T15:32:34.953 に答える
5

エラーレポートから、changeCounter変数の$ watchと、このウォッチャー関数があることがわかります。

function $locationWatch() {
    var oldUrl = $browser.url();
    if (!changeCounter || oldUrl != $location.absUrl()) {
        changeCounter++;
        $rootScope.$evalAsync(function () {
            if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl)
                .defaultPrevented) {
                $location.$$parse(oldUrl);
            } else {
                $browser.url($location.absUrl(), $location.$$replace);
                $location.$$replace = false;
                afterLocationChange(oldUrl);
            }
        });
    }
    return changeCounter;
};

また、changeCounterは、$ browser.url()が$ location.absUrl()と等しくない場合に、増分された値を取得します。$ watch関数は変更/反応のループを10回しか実行できないため、これらの10回の反復後にエラーが発生します。あなたが見ている価値を変えているので、それは結局壊れます。

これらの値($ location.absUrl()と$ browser.url())をログに記録し、他のブラウザーで一致する理由を確認しますが、ieでは一致しません。

于 2012-12-13T12:08:54.423 に答える
3

IE10で問題が発生していました。

window.location.href = '#/';

ルートを変更するため。以下のコードに置き換えます

$location.path('/');

問題を解決しました

于 2015-05-22T12:02:25.393 に答える
2

TLDR

使用している場合は、使用ui-routerすることもできます

$state.go('details', {id:item.ID});

バックグラウンド

ng-click="details(item)"私は次の関数を使用してリストビューから詳細ビューに移動し、リスト内のの場合は、で何でもクリックできるようにしtrました。

$scope.details = function (item) {
    $window.location.href = "#/details/" + item.ID;
}

しかし、私は10 $digest() iterations reachedIEで恐ろしくなりました。

ご参考までに

Tiagoの回答に従って、AngularJSv1.2.0rc1angular.jsの7650行目にブレークポイントを設定しました。

// update browser
var changeCounter = 0;
$rootScope.$watch(function $locationWatch() {
  var oldUrl = $browser.url();
  var currentReplace = $location.$$replace;

  if (!changeCounter || oldUrl != $location.absUrl()) {
    changeCounter++; /* <-- breakpoint here, line 7650 */
    $rootScope.$evalAsync(function() {
      if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).
          defaultPrevented) {
        $location.$$parse(oldUrl);
      } else {
        $browser.url($location.absUrl(), currentReplace);
        afterLocationChange(oldUrl);
      }
    });
  }
  $location.$$replace = false;

  return changeCounter;
});

結果

Chromeからの出力

  • ブレークポイントがヒットしたのは、詳細ページが読み込まれたときと1回だけでした。
  • oldUrl(つまり$browser.url()、古いURL(つまりリスト1)を報告していました)
  • $location.absUrl()詳細URLを報告していました。

IE7,8からの出力

  • ブレークポイントが継続的にヒットしました。
  • oldUrl(つまり$browser.url()、新しいURL(つまり詳細なURL)を報告していました)
  • $location.absUrl()まだリストのURLを報告していました。
于 2013-12-11T12:29:56.417 に答える
0

他のページにリダイレクトしようとしたときにこの問題が発生しました

$window.location.href = '#/path/'

次のように変更することで解決しました:

$location.path('/path/');
于 2017-09-13T19:41:02.237 に答える