2

$ionicPopup と Firebase の両方を使用して、いくつかの検証に次のコードを使用しています。

onTap: function(e) {
    firebase.auth().applyActionCode($scope.data.emailcnfrm)
        .then(function() {
            return $scope.data.emailcnfrm;
        },
        function(error) {   
            alert("wrong code");
            e.preventDefault();
        });
}

しかし、エラーの場合、「間違ったコード」アラートを受け取った後、e.preventDefault();無視されたため、ポップアップが閉じられます。

では、私のコードで正確に間違っているのは何ですか? どうすればこの問題を解決できますか?

4

2 に答える 2

1

への呼び出しfirebase.auth().applyActionCodeは非同期でありe.preventDefault、エラー コールバックで非同期に呼び出されます。これは、ユーザーがすでに を呼び出したonTapに発生するため、e.preventDefault何の効果もありません。

編集 (提案された修正)

onTapこれを修正するには、非同期ロジックをメソッドから分離できます。

var myPopup = $ionicPopup.show({
  onTap: function(e) {
    // always keep the popup open, because we'll decide when to close it later
    e.preventDefault();
  }
});

myPopup.then(function(res) {
  firebase.auth().applyActionCode($scope.data.emailcnfrm)
  .then(function() {
    // if successful, imperatively close the popup
    myPopup.close();
  }, function(err) {
    // log the error, or something
  });
});
于 2016-05-29T00:48:56.620 に答える
1

最後に、独自のトリックを使用して問題を解決しました。

-非同期の外側:

         $scope.myPopup = $ionicPopup.show({

             scope: $scope, buttons: [

             { text: 'Cancel' },

             {                  
                 text: '<b>Done</b>',

                 type: 'button-positive',

                 onTap: function(e)
                 {

                 // always keep the popup open, because we'll decide when to close it later
                 e.preventDefault();

                 $AsyncCallback();
                 }
             }
             ]
         });

$scope.myPopup.then(function(){},
                             function(error)
                             {
                                 $ionicPopup.alert({

                                 title: 'Internal error!',

                                 template: error
                                 });
                             });

-非同期の内部:

$scope.myPopup.close();
于 2016-05-29T14:53:48.067 に答える