我有以下代码

if (testNavigation() && $scope.selections.somethingChanged) {
    return false;
}

在testNavigation中,我正在调用模式对话框,如果在该对话框中回答“确定”,则会将somethingChanged重置为false。我的问题是,在执行代码时,绕过了testNavigation和模式对话框,并在以后执行,因此我的测试无法正常工作,因为我需要它来工作。为了使我的逻辑正常工作,我应该更改些什么,例如首先调用我的模式对话框,然后在main函数中进行相应操作?

这是我的testNavigation方法:

var testNavigation = function()
            {
                if ($scope.selections.somethingChanged) {

                    var modal = $modal.open({
                        controller: function ($scope) {
                            $scope.okClass = 'btn-primary',
                            $scope.okLabel = resourceFactory.getResource('Labels', 'yes'),
                            $scope.cancelLabel = resourceFactory.getResource('Labels', 'cancel'),
                            $scope.title = resourceFactory.getResource('Labels', 'unsavedChanges'),
                            $scope.message = resourceFactory.getResource('Messages', 'unsavedChanges');
                        },
                        templateUrl: '/app/templates/modal'
                    });

                    modal.result.then(function () {

                        $scope.selections.somethingChanged = false;

                    });
                }

                return true;
            }


我将尝试添加更多详细信息。我在索引页面 Controller 中具有LoadView()和New()函数。在这两个函数中,我都需要执行以下操作:

如果$ scope.selections.somethingChanged = false我需要继续进行逻辑处理。

如果$ scope.selections.somethingChanged = true,我需要弹出一个模式对话框,询问是否要继续并取消更改或保留在当前页面上。如果我回答"is",那么我想继续讲逻辑。

因此,这就是单独的testNavigation函数的目的。在每个函数调用都是顺序的语言中,这将按我的预期工作。但是在AngularJS / JavaScript中这种方式不起作用,我不确定如何使其按我需要的方式工作。我们尝试了一些$ q服务的想法,但没有得到结果。

最佳答案

testNavigation()为false且您不想问这个问题时,使somethingChanged始终返回一个promise(或者是模态结果,或者是false)。在解决这个promise时继续:

var testNavigation = function() {
    if ($scope.selections.somethingChanged) {
        var modal = [...]
        return modal.result;  // returns a promise that will be resolved when the modal is closed
    } else {
        return $q.when(true); // returns a promise that will be resolved straight away with true
    }
}

// when used:

testNavigation().then(function() {
    ...do stuff...
})

09-07 18:54