angularjs ng-if中的无限循环

时间:2016-04-07 09:58:07

标签: javascript angularjs mongodb loops

使用https://github.com/ironboy/mongresto框架,我有一个带有html和js的angularjs指令。问题是Assignment.get循环2000次以上,这让我觉得我的ng-if实现有问题,因为这会调用scope.hasAssignment。或者也许我正在寻找错误的地方

assignments.html

<!--Assignments-->
   <li ng-if = "hasAssignment(course.assignments)"><a  ng-click="isChildOpen = !isChildOpen">Assignments <i ng-hide="isChildOpen" class="fa--toggle fa fa-chevron-right"></i><i ng-show="isChildOpen" class="fa--toggle fa fa-chevron-down"></i></a>
   <ul ng-show="isChildOpen" ng-repeat="assignment in assignmentlist">
       <li><a href="courses/{{course.name}}/assignment/{{ assignment._id }}"><i class="fa--itemtype fa fa-file-text-o"></i>{{assignment.name}}</a></li>
   </ul>

assignments.js

scope.hasAssignment = function(assignmentArray) 
     {
         if(typeof assignmentArray !== 'undefined' && assignmentArray.length > 0)
          {                
              Assignment.get({course: scope.course._id}, function(res){
                 scope.assignmentlist = res;
              });
              return true;
          }
          else
          {
              return false;
          }
     }

我在传递给函数的assignmentArray上使用了一个控制台日志,它返回一个包含3个赋值的数组。该功能最终工作,并且列表中填充了来自db的结果,它只是一直运行。

1 个答案:

答案 0 :(得分:3)

当你在ngIf指令中设置它时,它会在每个$digest周期进行评估,在许多情况下会调用它,包括模型更改。因此,无论何时进行AJAX调用(异步),scope.assignmentlist = res;的更新都会触发另一个$digest周期,而这又会进行另一次调用等等......但即使在第一次加载时,{ {1}}周期将运行多次,每次都会进行调用,触发无限循环的请求...为了更深入地了解$digest周期,请阅读this文章。

因此,为了摆脱这种无限循环,您可以检查ngIf中的$digest条件:

.length

首先,检查是否定义了课程作业,然后检查是否有长度。在你的控制器中,在其他地方进行<li ng-if = "course.assignments && course.assignments.length"><a ng-click="isChildOpen = !isChildOpen">Assignments <i ng-hide="isChildOpen" class="fa--toggle fa fa-chevron-right"></i><i ng-show="isChildOpen" class="fa--toggle fa fa-chevron-down"></i></a> 调用(这取决于你的程序逻辑。在大多数情况下,你可以在控制器初始化时执行此操作)。