在Angular应用程序中,表单在提交之前通过自定义JS函数进行验证。 根据条件,我需要向用户显示确认对话框,等待确认或拒绝,然后继续验证。 我在异步实现这个方面遇到了困难。我相信我没有正确使用承诺,但不确定需要更新的内容。
厂
app.factory("confirmDialogService", ['$q', 'ngDialog',
function ($q, ngDialog ) {
return {
popConfirm: function () {
var deferred = $q.defer();
var confirmed;
setTimeout(function () {
ngDialog.openConfirm({
template: 'template/confirmDialog.html',
className: 'ngdialog-theme-default'
}).then(function (value) {
console.log('Modal promise resolved. Value: ', value);
deferred.resolve(confirmed = true);
}, function (reason) {
console.log('Modal promise rejected. Reason: ', reason);
deferred.reject(confirmed = false);
});
}, 1000);
return deferred.promise;
}
};
}]);
控制器
$scope.checkSomething = function (){
if(needsConfirmation)
{
console.log('about to pop confirm');
confirmationService.popConfirm().then(function(confirmed){
console.log( 'from popConfirm() ' + confirmed + ''); // never logged
return confirmed;
}, function(){
// something went wrong
return false;
});
}
else
return true;
}
显示确认对话框,但在对话框中单击是或否不会按预期生成结果。
我希望能够做的是取决于用户是否确认或取消对话框的真/假值
var canProceed = $scope.checkSomething();
我认为我需要将其包含在另一个承诺中但不确定如何。 任何帮助将不胜感激。
谢谢,
答案 0 :(得分:3)
由于openConfirm
已经返回了Promise,因此您无需再使用$q.defer()
创建一个:
app.factory("confirmDialogService", ['$q', 'ngDialog', function ($q, ngDialog) {
return {
popConfirm: function () {
return ngDialog.openConfirm({
template: 'template/confirmDialog.html',
className: 'ngdialog-theme-default'
}).then(function (value) {
console.log('Modal promise resolved. Value: ', value);
return true;
}, function (reason) {
console.log('Modal promise rejected. Reason: ', reason);
return false;
});
}
};
}]);
之后checkSomething
会以这种方式使用它:
$scope.checkSomething = function () {
if (needsConfirmation) {
return confirmationService.popConfirm().then(function (confirmed) {
return confirmed;
}, function () {
return false;
});
} else {
return $q.when(true);
}
}
请注意它不再返回true
或false
,而是返回一个promise对象。最后,您应该使用$scope.checkSomething()
,例如使用promises进行异步操作:
$scope.checkSomething().then(function() {
// ok, proceed
}, function() {
// something failed
});
总结一下,最重要的是要了解checkSomething
应该返回一个承诺而不仅仅是真/假。
答案 1 :(得分:0)
您不需要变量来通过resolve
和reject
方法传递它(但它会起作用):
.then(function (value) {
console.log('Modal promise resolved. Value: ', value);
deferred.resolve(true);
}, function (reason) {
console.log('Modal promise rejected. Reason: ', reason);
deferred.reject(false);
});
然后在控制器中:
$scope.checkSomething = function (){
if(needsConfirmation)
{
console.log('about to pop confirm');
confirmationService.popConfirm().then(function(confirmed){
console.log( 'from popConfirm() ' + confirmed + ''); // never logged
return confirmed; <-- this is not(!) a return of checkSomething method, this is return of success callback
}, function(){
// something went wrong
return false; //same as above
});
}
else {
return true;
}
}
所以你不能var canProceed = $scope.checkSomething();
你需要在回调中设置这个变量:
var canProceed;
confirmationService.popConfirm().then(function(confirmed){
canProceed = true;
}, function(){
// something went wrong
canProceed = false;
});