在 AngularUI 模式打开时暂停执行

Pause execution while AngularUI modal is open

我正在循环浏览 AngularJS 中的一些项目,并使用 AngularUI 模式询问用户对每个项目的输入。我的问题是循环结束并且所有模态一次呈现,而不等待用户。

如何让执行等到模式关闭?

我的代码示例:

var listofitems = somelist;
// loop through each item
for (var i in listofitems){
    if (listofitems[i].id == presetId){
        // ask user confirmation in a modal
        $scope.selections = {'doThis': doThis,
                             'doThat': doThat}
        var openModal = function () {
            var modalInstance = $modal.open({
                 templateUrl: 'confirmationModal.html',
                 controller: confirmationController,
                 resolve: {
                     selections: function () {
                          return $scope.selections;
                     }
                 }
            });

            modalInstance.result.then(function (selections) {
                doThis = selections.doThis;
                if (selections.doThat){
                   doThis = selections.doThis;
                }
          });
        }
        // open the modal
        openModal();                                                
      }
   }
}


var confirmationController = function ($scope, $modalInstance, selections) {

    $scope.selections = selections;

    $scope.doThis = function () {
        $scope.selections.doThis = true;
        $modalInstance.close($scope.selections);
    };

    $scope.doThat = function () {
        $scope.selections.doThat = true;
        $modalInstance.close($scope.selections);
    };
};

这里包含@dsfg 的回答Plunkr example。 ui 模式效果不佳,但您可以看到在用户提交任何输入之前执行已完成。

你不能只是暂停循环(你 可以 使用 ES6 生成器)。但是您可以更改遍历 array/object 键的方式。您可以做的是使用函数一项一项地检查项目,并仅在上一项完成后才执行下一项 "iteration" 。这对 promises 来说很容易。

首先,做出 openModal return 承诺,然后创建辅助函数 checkItems,该函数将为键数组中的每个项目调用。

var openModal = function() {
    var modalInstance = $modal.open({
        templateUrl: 'confirmationModal.html',
        controller: confirmationController,
        resolve: {
            selections: function() {
                return $scope.selections;
            }
        }
    });

    return modalInstance.result.then(function(selections) {
        doThis = selections.doThis;
        if (selections.doThat) {
            doThis = selections.doThis;
        }
    });
};

var listofitems = somelist;
var keys = Object.keys(listofitems);

(function checkItems() {

    // get the first key and remove it from array
    var key = keys.shift();

    if (listofitems[key].id == presetId) {
        // ask user confirmation in a modal
        $scope.selections = {
            'doThis': doThis,
            'doThat': doThat
        }
        // open the modal
        openModal().then(function() {
            if (keys.length) {
                checkItems();
            }
        });
    }    
})();

在上面的例子中,项目将被检查直到第一个承诺被拒绝。如果您想检查所有项目而不考虑承诺状态,请使用

openModal().finally(function() {
    if (keys.length) {
        checkItems();
    }
});