打开模态后,而不是关闭模态后,控制器“ somePopupCtrl”将返回true。
这是代码-
controller('somePopupCtrl', function ($scope, $rootScope) {
function delete() {
var retVal = true;
retVal = calculateRetCal();
if(retVal) {
var modalInstance = $modal.open({
templateUrl: 'removeData.html',
controller: 'removeDataPopupCtrl',
backdrop : 'static'
});
// want to return true for the delete() method when modal is closed.
modalInstance.result.then(function (data) {
return true;
});
} else {
return false;
}
return retVal;
}
}
方法delete()
返回true或false并基于此结果我们在UI中隐藏/显示。
但是,在打开模态时而不是在模态关闭之后,UI会立即hiding/showing
。因此modalInstance.result.then
代码不会生效。
是否可能是因为modalInstance.result.then
是异步调用?
仅在关闭模式时如何从方法返回?
答案 0 :(得分:0)
return语句不能按预期的那样工作。您的return语句将不等待完成模型实例结果函数。这就是异步函数的工作方式。
您应该传递一个回调函数来删除并调用它,就像这样。
抱歉,我没有运行此命令,但逻辑是正确的。
function delete(callback) {
var retVal = true;
retVal = calculateRetCal();
if(retVal) {
var modalInstance = $modal.open({
templateUrl: 'removeData.html',
controller: 'removeDataPopupCtrl',
backdrop : 'static'
});
// want to return true for the delete() method when modal is closed.
modalInstance.result.then(function (data) {
callback(true);
});
} else {
callback(false)
}
callback(retVal)
}
delete(function(response){
console.log(response);
//do what u want when you get response as true/false
})
答案 1 :(得分:0)
您无法从异步转换为同步代码。最灵活的方法是始终返回承诺:
if(retVal) {
return $modal.open({
templateUrl: 'removeData.html',
controller: 'removeDataPopupCtrl',
backdrop : 'static'
}).result;
} else {
return $q.reject('was not opened, or smth');
}
P.S。通常,$modal
可能会关闭,因此$modal().result
被拒绝(您的then()将不会运行),并且由于很可能会错过这种情况,所以您始终会返回promise和chain。
P.P.S。当您返回$ q.reject或$ q.when时-与完全同步的代码相比,您需要多支付1个摘要。如果要避免这种情况,可以使用上面建议的回调或承诺$$ state.status属性。