【问题标题】:Angular does not recognize scope variable change within forEach loopAngular 无法识别 forEach 循环中的范围变量更改
【发布时间】:2015-10-19 03:52:27
【问题描述】:

我有一个包含一些测试的数组,我必须按顺序运行。
在一个角度 forEach 循环中,我正在迭代测试数组并通过 http get 调用后端来启动当前测试。
我现在的问题是,用户应该可以停止测试运​​行,以便不再执行进一步的测试。 在视图中,我有一个“停止测试运​​行”按钮,它将 $scope.stopTest 变量设置为 true。在我的 foreach 循环中,我有一个条件,它在每次迭代时检查 $scope.stopTest 变量,如果它设置为 true,则跳过测试运行。
但似乎,循环角内部无法识别范围变量从假到真的变化。 我在循环中有一个测试输出,显示该值仍然为假。

在我看来,我有这些按钮:

<input type="button" class="btn" ng-click="runTests()" value="Start test run" ng-disabled="disabled == true" />
<input type="button" class="btn" ng-click="stopRunning = true" value="Stop test run" />

在我的控制器中我有这个代码:

$scope.runTests = function () {

angular.forEach($scope.selected, function (value, key) {

    if (!$scope.stopRunning) { // PROBLEM: angular does not recognize that stopRunning has changed already

        promise = promise.then(function () {

            $scope.count++;
            $scope.status = "Running test " + $scope.count + " of " + $scope.countSelectedTests + ".";

            return $http({
                method: 'GET',
                url: 'api/runtest/' + key
            }).then(function (res) {                            
                   $scope.testresults = res.data;                               
            });
        });   
    }
});

有人知道这里有什么问题吗?是关于子作用域还是摘要循环?我试图在更改 stopRunning 变量后调用 $apply() 或 $digest(),但没有任何效果。

如何通过按钮单击事件停止循环?

【问题讨论】:

    标签: javascript angularjs foreach


    【解决方案1】:

    我很确定问题*来自 angular 的 forEach。你见过this other question吗?

    *函数本身没有问题,只是不应该这样使用。

    好的,放弃那个。 我认为问题在于你的循环发生得太快了。它遍历所有“选定”元素,并在您单击停止按钮之前启动所有查询。如果要链接调用,请编写一个执行调用的递归函数,并在返回时为下一个元素调用自身。 这样,每个 http 调用都会在前一个调用完成后开始,您将有时间中断该过程。

     function callForEach(selected, i){
         if(i < selected.length){
         var item = selected(i);
         $http({
                method: 'GET',
                url: 'api/runtest/' + key
            }).then(function (res) {                            
                   $scope.testresults = res.data;
                if(!$scope.stopRunning){
                  callForEach(selected, i+1);
                }                               
            });
         }
     }
    

    【讨论】:

    • 感谢您的回答。是的,我已经读过这个问题了。但在这种情况下,布尔值不是范围变量,任何事件都不会从外部触发“循环中断”。
    • 我认为我的代码已经按顺序运行了。这就是为什么我在 .succes 和 .来自 http 服务的错​​误回调,它确实会异步运行。一旦测试返回,我会在视图中看到一个状态框,通知我测试结果。这种情况一个接一个地慢慢发生。
    • 您按顺序执行承诺,但是。条件在承诺之外,它在主线程中完成得非常快。在 Promise 的内部和外部添加 console.log,你会看到它是如何进行的。
    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多