打开模态是返回结果,而不是关闭模态后

时间:2018-07-02 14:25:56

标签: angularjs modal-dialog

打开模态后,而不是关闭模态后,控制器“ 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并基于此结果我们在U​​I中隐藏/显示。

但是,在打开模态时而不是在模态关闭之后,UI会立即hiding/showing。因此modalInstance.result.then代码不会生效。

是否可能是因为modalInstance.result.then是异步调用?

仅在关闭模式时如何从方法返回?

2 个答案:

答案 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属性。