Angular JS& Phonegap后退按钮事件

时间:2014-04-10 18:38:50

标签: angularjs cordova

我有一个MainCtrl包含历史的backstack,像这样;

$scope.urlHistory = [];

$scope.$on('$routeChangeSuccess', function () {
    if ($location.$$absUrl.split('#')[1] !== $scope.urlHistory[$scope.urlHistory.length - 1]) {
        $scope.urlHistory.push($location.$$absUrl.split('#')[1]);
    }
});

然后,在同一个控制器中,我有一个GoBack()函数,我想在按下后退按钮时调用;

$scope.goBack = function () {
    $scope.urlHistory.pop();
    $location.path($scope.urlHistory[$scope.urlHistory.length - 1]);
};

这应该有效,因为从我的index.html我用ng-click =" goBack()"一切都按预期工作。

我将它用于设备事件,同一个控制器;

function onBackKeyDown() {
  alert("back");
  $scope.goBack();
}

document.addEventListener("deviceready", onDeviceReady, false);
// device APIs are available
//
function onDeviceReady() {
  // Register the event listener
  alert("deviceready");
  document.addEventListener("backbutton", onBackKeyDown, false);
};

我可以看到提醒,但该应用没有导航回来。但是会发生一些事情,因为如果我按两次设备后退键,则ng-click =" goBack()"突然把我带回应用的起始页面。我使用$ scope错了吗?在Win Phone& amp; Android系统。使用Phonegap Build。

编辑:我真正想到的是为什么我的$ scope.goBack();从devicelistener调用时,函数的工作方式不同。

2 个答案:

答案 0 :(得分:1)

这解决了它:

  $scope.goBack = function () {
    if (urlHistory == '/') { 
      document.removeEventListener("backbutton", onBackKey, false);

    };    
    urlHistory.pop();
    $location.path(urlHistory[urlHistory.length - 1]);
    $scope.$apply();
  };

范围。$ apply();是我的回答。在角度以外执行角度表达式时,这是必要的。 (AngularJS $location not changing the path

答案 1 :(得分:0)

您应该只能使用浏览器的内置历史记录对象。例如:

function onDeviceReady() {
    document.addEventListener("backbutton", function () {
        window.history.go(-1);
    });
}

你不应该只是因为你正在使用角度来做任何具体的事情。除非我错过了其他的东西......

更新:查看phonegap docs后,看起来默认backbutton行为已经符合您的要求......或者您是否尝试做一些特别的事情?