【问题标题】:Angular JS & Phonegap back button eventAngular JS & Phonegap 后退按钮事件
【发布时间】:2014-05-24 15:35:16
【问题描述】:

我有一个 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 和 Android 上体验这一点。使用 Phonegap 构建。

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

【问题讨论】:

  • 这段代码的总体目的是什么?用户点击后退按钮是否只是导航到上一页?
  • 抱歉,如果不清楚,这正是目的。
  • 我知道出了什么问题。 $location.path();由事件侦听器调用时不起作用。使用 ng-click 调用它可以正常工作。

标签: angularjs cordova


【解决方案1】:

这解决了它:

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

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

范围.$apply();是我的答案。在 Angular 之外执行 Angular 表达式时,这是必要的。 (AngularJS $location not changing the path)

【讨论】:

    【解决方案2】:

    您应该能够为此使用浏览器的内置历史对象。例如:

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

    你不应该仅仅因为你使用 angular 就需要做任何特定的事情。除非我错过了其他东西......

    更新:查看phonegap docs 后,默认的backbutton 行为似乎已经满足了您的需求......或者您是否正在尝试做一些特别的事情?

    【讨论】:

    • 你是对的,除了 Windows Phone (8) 的默认后退按钮行为似乎正在退出应用程序。这就是我使用自己的“历史对象”的原因。此外,window.history.go(-1) 不适用于 Windows Phone。
    • 好的,抱歉。每当我进行 phonegap 开发时,我只针对 iOS 和 Android,所以我不熟悉 windows phone 的怪癖。但原理应该是一样的。任何将回到浏览器历史的跨平台代码都应该放在"backbutton" 监听器中。请参阅this post 了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多