1

Web サービス呼び出しで特定の数を超える行が返されたことを検出すると、メッセージ ボックスを表示する angularjs アプリがあります。残念ながら、Angular はサービスを呼び出すとダイジェスト ループに入ったように見え、メッセージ ボックスが 3 回表示されます。

私が関数をコーディングした方法とは関係がなければ、Angular が内部で何をする必要があるかはあまり気にしません。ただし、このメッセージ ボックスを 3 回表示したり (Web サービスを呼び出したり) したくないのは確かです。以下の関数が呼び出されるたびにコール スタックを調べると、呼び出しがアプリケーション コードから発信されたものではないことがわかります。

最初の呼び出しの後の呼び出しを無視できるように、ループの状態を検出するにはどうすればよいですか?

    function bindResults(expression) {
        var maxRows = 100;
        listData.search(expression, maxRows).then(function (data) {
            $scope.searchResults = data;
            if (data.length == maxRows)
            {
                var title = "Search Warning";
                var msg = "The maximum number of cases was returned, try being more specific";
                var btns = [{ result: 'ok', label: 'OK', cssClass: 'btn-primary' }];

                $dialog.messageBox(title, msg, btns)
                  .open(); 
            }
        });
    };
4

2 に答える 2

3

$scope.$$phase を確認することで、$digest が既に進行中であるかどうかを確認できます。

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

ここでより詳細な回答を参照してください:

リーの答え

于 2013-09-03T17:14:00.723 に答える
1

申し訳ありませんが、質問の説明はちょっとしたニシンでした。

よく調べてみると、ダイジェスト ループが原因ではなく、関連付けられている UI フラグメントが ng-view を介して含まれる部分ビューであるため、関数が複数回呼び出されていることがわかりました。このディレクティブは別のスコープを作成します。$routeProvider が (不必要に) コントローラー オプションで構成されているため、コントローラーの別のインスタンスも作成されます。

図については、このプランカーを参照してください。

于 2013-09-04T09:54:19.647 に答える