AngularJS验证和承诺

时间:2014-12-22 10:43:58

标签: javascript angularjs promise angular-promise ng-dialog

在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();

我认为我需要将其包含在另一个承诺中但不确定如何。 任何帮助将不胜感激。

谢谢,

2 个答案:

答案 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);
    }
}

请注意它不再返回truefalse,而是返回一个promise对象。最后,您应该使用$scope.checkSomething(),例如使用promises进行异步操作:

$scope.checkSomething().then(function() {
    // ok, proceed
}, function() {
    // something failed
});

总结一下,最重要的是要了解checkSomething应该返回一个承诺而不仅仅是真/假。

答案 1 :(得分:0)

您不需要变量来通过resolvereject方法传递它(但它会起作用):

           .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;
            });