我有以下代码
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...
})