AngularJS for循环不等待$ scope的修改

时间:2014-04-20 23:27:13

标签: javascript angularjs angularjs-scope angularjs-service

我已经在这脑子里挣扎了好几天,所以我觉得现在是时候终于问一个谁知道他们在做什么了。 ;)

我正在构建一个AngularJS应用程序并在我迭代几个for循环时遇到奇怪的行为。我试图找到最好的'给出一些可能性的添加到列表的选项,所以这是我想要完成它的一般过程:

理念:
1)将每种可能性添加到desination列表中,比如$ scope.list1
2)计算得分'基于列表的状态
3)从$ scope.list1中删除可能性 4)重复所有可能性。

以下是我在控制器中运行的基本概念:

$scope.getSuggestions = function(){
   //for each possibility to consider:      
   for(var i = 0; i < possibilities.length; i++){
      //add the possibility to the scope as per usual
      $scope.list1.push(possibilities[i]);

      //calculate the score given the state of the scope
      $scope.calculateScore();

      //save the score in a new object on the scope
      $scope.results.push({"option": possibilities[i],
                           "score": $scope.score
      });

      //remove the possibility to reset the scope back to its original state
      $scope.list1.pop();
   }
};

问题:
看起来我的for循环实际上是在代码执行完之前继续进行进一步的迭代。我的$ scope.calculateScore()函数可能需要一些时间才能运行,而且好像它被for循环忽略了。我在该功能中没有做任何明显异步的事情;它主要是基于$ scope状态的循环,以及一些数学得分&#39;。

我的问题:
为什么Angular认为在里面的代码没有完成执行的情况下继续开始使用for循环是可以的?我知道在某些情况下它是如何有意义的,但在这一点中,在先前的功能完成之后,一切都按顺序发生是至关重要的。你们对如何使这项工作有任何建议吗?

注意:您可以通过http://www.PlatTheLeague.com

查看来源查看完整代码

calculateScore()的实际代码位于scripts / controllers / teamBuilderCtrl.js中,其中该函数名为$ scope.populateGamePredictions()。我对这些建议的初步尝试都在同一个文件中,名为$ scope.getChampSuggestions。要查看问题,请将项目从左侧列表拖到“他们的顶级&#39;然后点击“冠军建议”#39;标签。该选项卡填充上面列出的伪代码中的$ scope.results的结果,但似乎我的范围对象上的teamScore未正确设置。

干杯!

2 个答案:

答案 0 :(得分:0)

也许你有一些逻辑可以改变来自AngularJS之外的$scope的内部状态,可能是来自DOM,ajax回调,setTimeout的某些事件...在这种情况下,$apply方法可以帮助。您可以从此处获得更多$apply的引用:https://github.com/angular/angular.js/wiki/When-to-use-$scope.$apply()

答案 1 :(得分:0)

事实证明,上述想法以典型的同步方式运作,正如我在这个掠夺者身上证明的那样:http://plnkr.co/edit/9spVbf5JWx9Hnq53sHSV?p=preview

我的问题源于这样一个事实:我的calculateScore()函数正在处理的数据模型没有按照我的想法进行格式化(我自己的错,感谢应用程序的半复杂性...这意味着虽然代码按预期运行,但这些分数并没有在第一时间正确更新。