1

我有一个 angularjs 应用程序,当它检测到在 Web 服务调用中返回了超过一定数量的行时,它会显示一个消息框。然而不幸的是,当我调用该服务时,angular 似乎进入了它的摘要循环,并且消息框显示了 3 次。

我并不真正关心 Angular 需要在内部做什么,只要它与我编写函数的方式无关。但是,我当然不希望这个消息框(也不调用 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 是(不必要地)使用控制器选项配置的。

请参阅此 plunker以获取插图。

于 2013-09-04T09:54:19.647 回答