Cordova backbutton preventDefault无效

时间:2014-04-24 22:51:25

标签: angularjs cordova-3 ionic-framework

我有使用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"
    });

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

2 个答案:

答案 0 :(得分:0)

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

这是我的服务:

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

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

答案 1 :(得分:0)

在Ionic / Cordova上禁用后退按钮

$ionicPlatform.registerBackButtonAction(null, 101);