2014-04-24 85 views
3

我有使用ionframework和cordova完成的应用程序。在我的应用程序中,我有要求,如果用户按下按钮,然后我需要忽略它。但只有在用户第三次按下它时才会关闭应用程序。科尔多瓦backbutton preventDefault不起作用

以前的项目是使用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" 
    }); 

但我不喜欢主意抛出异常。

+0

我不知道你在哪里使用@jcesar我只张贴的preventDefault – jcesarmobile

+0

解决方法... –

+0

无论如何,如果你听backbutton事件并创建一个函数不管理它,你不必防止任何事情。尝试添加第三个参数给函数。 document.addEventListener(“backbutton”,yourCallbackFunction,false); – jcesarmobile

回答

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

希望这将帮助你:)