Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS for循环不等待对$scope的修改_Javascript_Angularjs_Angularjs Scope_Angularjs Service - Fatal编程技术网

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

Javascript AngularJS for循环不等待对$scope的修改,javascript,angularjs,angularjs-scope,angularjs-service,Javascript,Angularjs,Angularjs Scope,Angularjs Service,我已经为此绞尽脑汁好几天了,所以我想是时候问一个真正知道他们在做什么的人了 我正在构建一个AngularJS应用程序,当我遍历几个for循环时,会出现一个奇怪的行为。我正试图找到一个“最佳”选项,在给出一些可能性的情况下添加到列表中,下面是我希望如何完成的一般过程: 想法: 1) 将每个可能性添加到设计列表中,例如$scope.list1 2) 根据列表的状态计算“分数” 3) 从$scope.list1中删除该可能性 4) 重复所有可能的步骤 以下是我在控制器中运行的基本概念: $scope.

我已经为此绞尽脑汁好几天了,所以我想是时候问一个真正知道他们在做什么的人了

我正在构建一个AngularJS应用程序,当我遍历几个for循环时,会出现一个奇怪的行为。我正试图找到一个“最佳”选项,在给出一些可能性的情况下添加到列表中,下面是我希望如何完成的一般过程:

想法:
1) 将每个可能性添加到设计列表中,例如$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();
   }
};
$scope.getSuggestions=function(){
//对于要考虑的每种可能性:
对于(变量i=0;i<0.length;i++){
//根据通常情况,将可能性添加到范围中
$scope.list1.push(可能性[i]);
//根据范围的状态计算分数
$scope.calculateScore();
//将分数保存在范围上的新对象中
$scope.results.push({“option”:可能性[i],
“分数”:$scope.score
});
//消除将作用域重置回其原始状态的可能性
$scope.list1.pop();
}
};
问题:
似乎我的for循环实际上是在代码完成执行之前进行进一步的迭代。我的$scope.calculateScore()函数可能需要一些时间才能运行,而且for循环似乎忽略了它。在这个函数中,我没有做任何明显的异步操作;它主要是基于$scope状态的其他for循环和一些数学来获得“分数”

我的问题:
为什么Angular认为在for循环中的代码还没有执行完的情况下,继续使用for循环是可以的?我知道它在某些情况下是有意义的,但在这个例子中,在前面的函数完成之后,一切都按顺序进行是至关重要的。你们对如何做到这一点有什么建议吗

注意:通过查看源代码,您可以看到完整的代码

calculateScore()的实际代码位于scripts/controllers/teamBuilderCtrl.js中,其中的函数名为$scope.populateGamePredictions()。我最初尝试的建议都在同一个文件中,名为$scope.getChampSuggestions。要查看问题,请将左侧列表中的一个项目拖到显示“他们的顶部”的框中,然后单击“冠军建议”选项卡。该选项卡应该填充上面伪代码中列出的$scope.results的结果,但是我的scope对象上的teamScore似乎没有正确设置


干杯

也许您有一些逻辑可以从AngularJS外部更改
$scope
的内部状态,也可能是从DOM、ajax回调、setTimeout。。。在这种情况下,
$apply
方法会有所帮助。您可以从这里获得更多关于
$apply
的参考资料:

事实证明,上述想法以典型的同步方式工作,正如我在本书中向自己证明的那样:


我的问题产生于这样一个事实,即我的calculateScore()函数正在处理的数据模型的格式与我想象的不完全一样(我自己的错,这要归功于应用程序的半复杂性质…),这意味着分数一开始没有被正确更新,尽管代码按预期运行。

angular是基于js构建的,因此假设代码中没有异步内容,angular就无法“闪耀”。JS将阻塞线程,直到函数返回。如果你做一些日志记录,你可以向自己证明,或者确认一些不可靠的事情正在发生。calculateScore()做什么?calculateScore()没有任何Ajax或http调用或类似的调用。这就是为什么我被这个弄糊涂了。。。我想知道创建一些日志记录是否只是我的最佳选择。我以前从未做过,但这并不意味着这仍然不是一个好主意异步不需要是ajax。请向我们提供calculateScore的代码,我可以确认,鉴于calculateScore是同步的,此代码将在不“烧穿”的情况下完成。。。