angularjs - ionic + android 后退按钮 + sidemenu isOpen 检测 - 工作不可靠

标签 angularjs ionic-framework

我有一个奇怪的情况。我正在编写一个带有左滑动菜单的 Angular + ionic 应用程序,这是我正在尝试做的事情:

1) 捕获 Android 后退按钮 2)当你点击后退按钮时,如果菜单没有打开,带你到菜单(打开它) 3) 如果菜单已打开并且您点击了后退按钮,请退出应用

为了捕获后退按钮,我在 app.run 中有这段代码(也尝试重新定位到一个基本 Controller 并将它与 $controller 一起注入(inject)到其他 Controller 中,没有任何区别)

我注意到的是,如果我真的点击菜单的“菜单图标”,“isOpen”会在我打开和关闭菜单时可靠地交替打印 true/false

但是,当我点击 Android 后退按钮时,它第一次工作(打印 true 或 false),但每次后续点击都不会改变 isOpen 状态,而菜单实际上会切换。

因此,这使我无法以编程方式检测菜单是在 android 后退按钮处理程序中打开还是关闭。

令我困惑的是,为什么这只是 android 后处理程序中的问题,而不是当我点击菜单项时的问题。在这两种情况下调用的代码相同,即

$ionicSideMenuDelegate.toggleLeft();

我的 Android 处理程序代码:

 $ionicPlatform.registerBackButtonAction(function (event) {
             $ionicSideMenuDelegate.toggleLeft();
        $ionicSideMenuDelegate.$getByHandle('sideMenu').toggleLeft();
            $timeout ( function() {
            console.log ("Status of SIDE MENU IS : " + $ionicSideMenuDelegate.$getByHandle('sideMenu').isOpen());
            },1000);

}, 100);

我还设置了一个 codepen,虽然不确定如何在 android 设备上测试它,因为每次我尝试点击 codepen 或 jsfiddle 上的后退按钮时,它都会使浏览器返回一个页面。

对正在发生的事情有任何了解吗?我在 ionic 论坛上问过,但还不能找出原因(还)--> 因此向 SO 社区发帖,希望它能吸引更广泛的受众。

最佳答案

registerBackButtonAction 需要 priority覆盖其他操作:

The priorities for the existing back button hooks are as follows: Return to previous view = 100 Close side menu = 150 Dismiss modal = 200 Close action sheet = 300 Dismiss popup = 400 Dismiss loading overlay = 500

Your back button action will override each of the above actions whose priority is less than the priority you provide. For example, an action assigned a priority of 101 will override the 'return to previous view' action, but not any of the other actions.

我已经测试了这段代码,它按预期工作:

.run(function($ionicPlatform, $ionicSideMenuDelegate, $ionicPopup) {
        $ionicPlatform.registerBackButtonAction(function(e) {
            e.preventDefault();
            if (!$ionicSideMenuDelegate.isOpenLeft()) {
                $ionicSideMenuDelegate.toggleLeft();
            } else {
                navigator.app.exitApp();
            }
        }, 1000);   
});

如您所见,我使用优先级 1000 来确保覆盖所有默认操作。

我还使用了 preventDefault()。我认为您不需要这个,但以防万一。

这段代码只适用于左侧菜单,因为我只检查:

$ionicSideMenuDelegate.isOpenLeft()

只打开左边的:

$ionicSideMenuDelegate.toggleLeft()

但您可以更改它以使用 right菜单也是如此。

更新:

如果有人有兴趣了解更多关于 Android 和后退按钮的信息,这是最好的 article到目前为止我已经读完了。

关于angularjs - ionic + android 后退按钮 + sidemenu isOpen 检测 - 工作不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31541112/

相关文章:

Android 项目未解析任何静态 Assets

javascript - 包含 ng-model 和 ng-repeat 后切换开关不切换

javascript - 如何使用 Angularjs ionic 缓存图像?

angularjs - 查找在 angular.mock.exceptionHandlerProvider 中抛出的异常的真正来源

angularjs - 使用 VS 2013 在 Typescript 中装饰 Angular 异常处理程序服务

html - div 上的 ionic 背景 img 不加载本地镜像,但从互联网 url 加载图像

angular - 检索 Firebase 快照导致加载时出现验证错误

angularjs - 将 cordova 插件 paypal 与 ionic 集成

javascript - Angular js : Adding list of nested array properties

javascript - 我如何检测 Angular 翻译文件是否已加载