我有一个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调用时,函数的工作方式不同。
答案 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
行为已经符合您的要求......或者您是否尝试做一些特别的事情?