Cordova backbutton preventDefault无效

问题描述 投票:3回答:2

我有使用ionicframework和cordova完成的应用程序。在我的应用程序中,我要求如果用户按下后退按钮,那么我需要忽略它。但只有在用户第三次按下它之后才能关闭app。

以前的项目是使用phonegap和jquery完成的,相同的代码也可以。当我抛出一个异常时,我做了一个小的解决方法,然后它不应该关闭应用程序。

 document.addEventListener("backbutton", function (e) {
        if (new Date() - firstDateClick > 1000) {
            firstDateClick = new Date();
            totalClicks = 1;
        } else {
            totalClicks++;
            if (totalClicks >= 3) {
                var answer = confirm('Are You Sure You Want Exit');
                if (answer) {
                    var service = angular.injector(['ng', 'starter.services']).get('DanceService');
                    service.logEvent("exit")
                        .then(function () {
                            alert('exit1')
                            if (navigator.app) {
                                navigator.app.exitApp();
                            }
                            else if (navigator.device) {
                                navigator.device.exitApp();
                            }

                        })
                } else {
                    totalClicks = 1;
                }
            }
        }
        throw "ignore"
    });

但我不喜欢抛出异常的想法。

angularjs cordova-3 ionic-framework
2个回答
0
投票

在从应用程序注销之前我做了两次控制。因此,用户可以按一次,并且将出现一个Toast,文本“再次按下退出”,第二次按 - >退出。

这是我的服务:

    var deregisterFunction = null;

    return {
        disableBack: disableBack,
        registerAction: registerAction,
        goHome: goHome,
        goBack: goBack,
        deregisterAction: deregisterAction,
        closeApp: closeApp
    };

    function disableBack() {
        deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(null, 101));
    }

    function registerAction(cb, priority) {
        deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(cb, priority));
    }

    function deregisterAction() {
        if (deregisterFunction) {
            deregisterFunction();
        }
        goBack();//default behaviour
    }

    function goHome() {
        deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(function() {
            $state.go('app.home');
        }, 101));
    }

    function goBack() {
        deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(function() {
            $ionicHistory.goBack();
        }, 101));
    }

    function closeApp() {
        deregisterFunction = angular.copy($ionicPlatform.registerBackButtonAction(function() {
            ionic.Platform.exitApp();
        }, 101));
    }

这是我的utils服务:

    var service = {
      logoutToast: logoutToast,
      resetToastCount: resetToastCount
    };

    var toastCount = 0;

    return service;

    function resetToastCount() {
      toastCount = 0;
    }

    function logoutToast() {
      switch (toastCount) {
        case 0:
          $cordovaToast.show('Press again to log out', 'short', 'bottom');
          toastCount++;
          break;
        case 1:
          toastCount = 0;
          //logout
          break;
        default:
          $cordovaToast.show('Error', 'short', 'bottom');
      }
    }

}
}());

所以在我的控制器中我有这个用于注册我的服务的动作:

$scope.$on('$ionicView.afterEnter', backButtonService.registerAction(utils.logoutToast, 101));

这用于重置我想要的计数:

$scope.$on('$ionicView.afterEnter', utils.resetToastCount());

这用于在导航时取消注册我的操作:

$scope.$on('$stateChangeStart', backButtonService.deregisterAction);

希望这会对你有所帮助:)


0
投票

禁用Ionic / Cordova上的后退按钮

$ionicPlatform.registerBackButtonAction(null, 101);
© www.soinside.com 2019 - 2024. All rights reserved.