1

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

これを別の約束にラップする必要があると思いますが、方法がわかりません。どんな助けでも大歓迎です。

ありがとう、

4

2 に答える 2

3

はすでに Promise を返しているためopenConfirm、次のようにもう 1 つ作成する必要はありません$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);
    }
}

trueorfalseではなく promise オブジェクトを返すことに注意してください。最後に$scope.checkSomething()、promise で非同期操作のように使用する必要があります。

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

checkSomething要約すると、真/偽だけでなく、約束を返す必要があることを理解するために最も重要なことです。

于 2014-12-22T10:58:37.347 に答える
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;
            });
于 2014-12-22T10:58:52.457 に答える