ng-if 导致无限循环

ng-if resulting in an infinite loop

首先简单描述一下我想做什么:我想遍历数组的元素并显示它的内容。根据我从数组中的元素获得的信息,我想显示一个按钮或不显示一个按钮。

但这似乎行不通。让我们看一下代码:

<div class="padding20" ui-view="create-event-form" ng-controller="detailedViewController" ng-init="loadDetails()">
 <button type="submit" class="button success" ng-if="getParticipationStatus(eventDetails._id)">Participate on this event!</button>

如您所见,我通过 ng-if 方法从我的 detailedViewController 访问内部。 detailedViewController 包含以下方法:

$scope.getParticipationStatus = function( eventId ) {
    var userName = cookieUserManagement.getUsername();
    userClient.getUserEvents( eventId, userName, function ( success, hostingList ) {
        var i = 0;
        var participationStatus;
        if ( success ) {
            hostingList = hostingList.ownEvents;
            if (hostingList.length > 0) {
                for (i = 0; i < hostingList.length; i++) {
                    if (hostingList[i]._id == eventId) {
                        participationStatus = true;
                    } else {
                        participationStatus =  false;
                    }
                }
                return participationStatus;
            }
        }
    } );
};

现在的问题是:所有参数都以正确的方式处理。我看到了正确的 ID、正确的对象,一切似乎都是正确的。但是这段代码导致无限循环(即发出警报并享受来自浏览器的永无止境的警报)和以下错误消息:

angular.js:13642TypeError: callback is not a function
at services.js:374
at angular.js:16104
at m.$eval (angular.js:17378)
at m.$digest (angular.js:17191)
at m.$apply (angular.js:17486)
at l (angular.js:11637)
at D (angular.js:11843)
at XMLHttpRequest.w.onload (angular.js:11776)(anonymous function) @ angular.js:13642


angular.js:13642Error: [$rootScope:infdig] http://errors.angularjs.org/1.5.6/$rootScope/infdig?p0=10&p1=%5B%5D
at Error (native)
at http://127.0.0.1:3000/node_modules/angular/angular.min.js:6:412
at m.$digest (http://127.0.0.1:3000/node_modules/angular/angular.min.js:143:281)
at m.$apply (http://127.0.0.1:3000/node_modules/angular/angular.min.js:145:401)
at l (http://127.0.0.1:3000/node_modules/angular/angular.min.js:97:250)
at D (http://127.0.0.1:3000/node_modules/angular/angular.min.js:101:373)
at XMLHttpRequest.w.onload (http://127.0.0.1:3000/node_modules/angular/angular.min.js:102:397)

据我所知,我已经以正确的方式声明了所有内容。但是不知道为什么会死循环

感谢任何帮助!提前致谢。

您的 ng-if 中的函数是异步的,因此它不会 return 布尔值,如 angular 所期望的那样。它甚至可能根本没有 return 值,因为不会调用回调。

我建议将观察到的 ng-if 属性 更改为范围变量而不是函数调用。然后你可以随时调用你的异步函数(通过 setInterval 或其他......但你绝对应该找到更好的方法)并且在回调中,只需将范围变量设置为 true 或 false。 Ng-if "watches" 作为变量的值,并将触发一个摘要,其中元素将被渲染或不被渲染。 所以它在视图中应该看起来像这样:

<div class="padding20" ui-view="create-event-form" ng-controller="detailedViewController" ng-init="loadDetails()">
<button type="submit" class="button success" ng-if="participationStatus">Participate on this event!</button>

和控制器方法:

$scope.getParticipationStatus = function( eventId ) {
    var userName = cookieUserManagement.getUsername();
    userClient.getUserEvents( eventId, userName, function ( success, hostingList ) {
        var i = 0;
        if ( success ) {
            hostingList = hostingList.ownEvents;
            if (hostingList.length > 0) {
                for (i = 0; i < hostingList.length; i++) {
                    if (hostingList[i]._id == eventId) {
                        $scope.participationStatus = true;
                    } else {
                        $scope.participationStatus =  false;
                    }
                }
            }
        }
    } );
};

唯一剩下的就是在控制器初始化时调用该方法,因此只需在控制器函数体内调用 $scope.getParticipationStatus($scope.eventDetails._id)。