我已经在这脑子里挣扎了好几天,所以我觉得现在是时候终于问一个谁知道他们在做什么了。 ;)
我正在构建一个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未正确设置。
干杯!
答案 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()函数正在处理的数据模型没有按照我的想法进行格式化(我自己的错,感谢应用程序的半复杂性...这意味着虽然代码按预期运行,但这些分数并没有在第一时间正确更新。