使用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的结果,它只是一直运行。
答案 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>
调用(这取决于你的程序逻辑。在大多数情况下,你可以在控制器初始化时执行此操作)。