javascript - Angular 无限 $digest 循环

标签 javascript angularjs infinite-loop

我正在开发一个网站,您可以在该网站上搜索食物,看看它是水果、蔬菜还是两者都不是(因为我很无聊)。我决定使用 Angular,尽管我对它还很陌生。 我开始收到此错误:$rootScope:infdig Infinite $digest Loop

这可能是也可能不是准确的措辞或错误,因为页面滞后太多,我无法打开 Javascript 控制台。

这是我的结果 View Controller :

app.controller('resultController', ['$scope', '$routeParams', '$http',
    function($scope, $routeParams, $http) {
        $scope.result = $routeParams.query;

        $scope.whatIsIt = function() {
            $http.get('json/foods.json').success(function(data) {
                var lists = JSON.parse(data);
                var itIsA = 'uuggghhhhh';

                if (lists['fruit'].contains($scope.result)) {
                    itIsA = 'fruit';
                } else if (lists['vegetable'].contains($scope.result)) {
                    itIsA = 'vegetable';
                }
            });
        }
    }]);

这是我的应用模块:

var app = angular.module('fruitOrNot', [
    'ngRoute'
]);

app.config(['$routeProvider' ,
    function($routeProvider) {
        $routeProvider.when('/', {
            templateUrl: 'layouts/fruit-search.html',
            controller: 'searchController'
        }).when('/:query', {
            templateUrl: 'layouts/result.html',
            controller: 'resultController'
        });
    }]);

这里是 layouts/result.html:

<h1>{{ result }}</h1>
<p>{{ result }} is a {{ whatIsIt() }}</p>

所以我想知道是什么导致了 $digest 循环错误,或者如何找出原因,因为我无法使用控制台。谢谢!

整个项目是here在 Github 上也是如此。

最佳答案

您遇到的问题是您在作用域上设置了一个字段,它隐式调用了 $digest 并再次布置了模板。但是,布局模板再次发出 http 请求,然后更改范围,调用 $digest。这就是无限循环。

您可以通过确保在模板布局期间永远不会触发 http 请求来避免这种情况。

实现您的应用程序的一种更 Angular 正确方法是将您的 GET 请求提取到适当的服务中,然后将您的服务注入(inject)到 Controller 中。

然后在 Controller 中进行服务调用,如下所示:

app.controller('resultController', ['$scope', '$routeParams', 'whatsitService',
    function($scope, $routeParams, $http) {
        $scope.result = $routeParams.query;
        whatsitService.doit().then(function(result) {
            $scope.whatsit = result;
        }
    })
;

您的模板将如下所示:

<h1>{{ result }}</h1>
<p>{{ result }} is a {{ whatsit }}</p>

关于javascript - Angular 无限 $digest 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24592283/

相关文章:

javascript - 无法使用 Angular 和 Spring 触发有效请求

jquery - Angularjs 使用 $http 发送搜索过滤器数据

C——无限循环,我想?

javascript - 遍历由字符串定义的 $scope

javascript - 如何在 Javascript 中获取嵌套数组的长度?

resources - Smalltalk:单个对象可以通过进入无限循环来阻塞整个系统吗?

javascript - JQuery/ASP.NET 的挫败感

javascript - 如何使用 spring-security 检查用户是否登录?

javascript - 在选择文件之前发送的表格

javascript - 使用正则表达式计算字符串中子字符串的所有出现次数