javascript - Angularjs 迭代内更新范围

标签 javascript angularjs angularjs-scope angularjs-digest

在下面的代码中,我试图获取每个问题的子问题列表并在 View 中显示它们,但我在更新每个问题的子问题时遇到问题,它不会更新,所以我得到所有问题的相同子问题列表。

如何显示每个问题并列出其下的所有子问题?

  function loadAllQuestionGroup () {
    Questiongroup.query({}).$promise.then(function(group){
        vm.questiongroups = group;
        for(var i=0;i<group.length;i++){
           var grouptitle=group[i].title
            Question.questionsByQuestionGroup({id:group[i].id}).$promise.then(function(question){
                vm.question = question; 
               for(var j=0;j<question.length;j++){    
                  Subquestion.subquestionsByQuestion({id:question[j].id}).$promise.then(function(subquestion){
                      vm.subquestions=subquestion;
                    });                        
              }
         });
        }
      });
    }

 <div ng-repeat="question in vm.question">
   {{question.name}}
   <div ng-repeat="subquestion in vm.subquestions">
     {{subquestion.name}}
   </div>
 </div>

最佳答案

看起来这不是与 Angular 范围相关的问题,而是您遇到问题的纯 JavaScript 范围。如果您在循环中进行异步调用,您每次都会收到最后一个元素。要修复它,您应该使用匿名函数将 Promise 包装在循环内。

查看这个经典示例(您可以认为 setTimeout 函数相当于您的 Question.questionsByQuestionGroup({id:group[i].id}).$promise,它们都是异步函数)

//THIS IS EQUIVALENT TO YOUR CASE
//In this case it will return each time last element, 5 in this case
for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i)
  });
}
//Result: 5 5 5 5 5

//THIS IS HOW YOU SHOULD REFACTOR
//Make a wrapper for async, and it will work as needed
for (var j = 0; j < 5; j++) {
  (function(index) {
    setTimeout(function() {
      console.log(index)
    });
  })(j);
}
//Result: 0 1 2 3 4

附注在使用包装器修复它之后,您的代码将更加难以阅读,最好将其重构为单独的函数。

关于javascript - Angularjs 迭代内更新范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38594160/

相关文章:

angularjs - Angular 基础教程不适用于 Windows?

javascript - 使用同一 Angular Directive(指令)的多个副本时,变量不能独立运行

javascript - 如何检查所有箭头函数是否为真?

angularjs - 将链接从移动网络浏览器迁移到移动应用程序

javascript - 为什么 Javascript `iterator.next()` 返回一个对象?

html - 位置固定的 css 添加到 Angular Material 中的 body 标签中

javascript - AngularJS 中的 $scope 没有改变

javascript - $scope.$apply 会降低性能

javascript - 我如何在div下方插入html

javascript - 快速父文件夹访问