如何在 Angularjs 循环中增加进度条

How to Increase a progress bar in Angularjs loop

我正在学习 angularjs,我在循环期间增加进度条时遇到了一些问题。

我会解释得更好。我有带有所有月份复选框的模态,就像下面网站上显示的那样

http://vitalets.github.io/checklist-model/

所以,我可以选择一个或多个月来获取数据。

html代码是

 <fieldset>
    <input type="checkbox" ng-model="calendar" ng-change="keepMonths()">All
    <div ng-repeat="month in months">
        <div class="row">
            <input type="checkbox" checklist-model="choose.selected" checklist-value="month"> {{month.name}}
        </div>
    </div>
    <button name="Export" ng-click="exportExcel()" class="upButton">Export</button>
    <div class="demo-section k-content" style="width: 350px;">
        <h4>{{status}}</h4>
        <div kendo-progress-bar="progressBar" k-min="0" k-max="100" ng-model="progress"></div>
    </div>
</fieldset>

如果我点击导出按钮确实可以正常工作,但我想放一个进度条,因为月份的处理需要很多时间,我希望用户关注数据的处理,所以我尝试要做到这一点:

   $scope.exportExcel = function () {

    $scope.status = "Processing...";  // it doesn't work
    $scope.$apply($scope.status);  // it doesn't work

    var data = []
    var Increase = $scope.choose.selected.length / 100

    for (var i = 0; i < $scope.choose.selected.length; i++) {
        startDate = new Date("01/01/2015 00:00:00"; //for example
        endDate = new Date("31/01/2015 23:59:59"; //for example

            MUSTService.GetExcel($rootScope.empreendimento, $rootScope.pontoconexao, postohorario, dataInicio, // GetExcel goes to code behind and returns a json (dados) with all data of that month
            function (dados) {
                data = $scope.concatDados(dados, data);  // concatDados is responsible for concatenate all data from months in one variable (data)
            }, null, dataFim);  

        $scope.progress = $scope.progress + Increase; // it doesn't work
        $scope.$apply($scope.progress); // it doesn't work
        $scope.progress = 20; // it doesn't work (for test)
        $scope.$apply($scope.progress); //  it doesn't work (for test)
    }

    // the code below is only responsible for downloading the excel
    var query = 'SELECT NomReduzido AS [Empreendimento], NomCurto AS [Ponto de conexão], DinQuinzeminutos AS [Data/Hora], IFNULL(CodOrigem, \'\') AS Origem, ';
    query = query + ' INTO XLSX("MUST_' + $rootScope.empreendimento.trim() + '_' + decodeURI($rootScope.pontoconexao).trim() + '_' + $rootScope.postohorario.trim() + faltante + '.xlsx" , ? ) FROM ?';
    alasql(query, [opts, data]);

    $scope.progress = 20; // it works
    $scope.$apply($scope.progress); // it works
    $scope.status = "concluded..."; // it works
    $scope.$apply($scope.status);   // it works
}

如果我尝试增加进度条,它不起作用。进度条在for循环结束后才开始增加,我也不知道为什么。 我在代码里放了一些注释,帮助大家理解。

我试图将类似的东西放在循环中,只是为了测试,但它不起作用。但是,如果我将相同的代码放在循环之外,它就可以工作,但真正需要时间的是循环部分,因此在此处增加是很重要的。

   $scope.progress = 20;
   $scope.$apply($scope.progress);

我什至尝试放一张带有消息的图像 "Loading",但图像仍然只在 for 循环结束时出现。

如果有人能帮我展示一种在循环中增加进度条甚至显示图像的方法,我将不胜感激

$scope.progress 在代码中的正确时间正确设置。但是,只要您的脚本同步执行,您就永远不会看到在进度条本身上显示更新的重绘。在桌面应用程序中,这个问题通常通过 UI 线程和工作线程来处理。 UI 线程基本上是空闲的,所以当它被告知进度已经增加时,它会很高兴地重新绘制。现在撇开 Web Workers,JavaScript 是单线程的,所以当你在 for 循环中时,它永远不会空闲并允许重绘。

如果这个进度条是必不可少的,那么绝非易事的答案是使用 $timeout 使您的 for 循环异步。即使将超时延迟设置为 0 也应该有效。

可以在 this Stack Overflow question and the accepted answer on this one 的第二个答案中找到更多信息以及如何进行的想法。