离子+安卓后退键+侧边菜单isOpen检测-工作不可靠



我有一个奇怪的情况。我正在编写一个带有左侧幻灯片菜单的angular + ionic应用程序,下面是我要做的:

1)捕获Android返回按钮2)轻按后退键时,如果菜单未打开,则带您到菜单(打开)3)如果菜单打开,你按了后退键,退出应用

要捕获后退按钮,我在app.run中有此代码(也尝试重新定位到基本控制器并将其与$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需要一个优先级来覆盖其他操作:

现有后退按钮挂钩的优先级如下:返回到前一个视图= 100关闭侧菜单= 150解散模式=200关闭动作表= 300解散弹出窗口= 400解散加载叠加= 500

你的后退按钮动作将覆盖上面的每个动作优先级低于您提供的优先级。例如,一个动作如果优先级为101,将覆盖"返回到以前的视图"。操作,但不包括任何其他操作。

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

.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()

但是你也可以改变它来使用正确的菜单

:

如果有人有兴趣了解更多关于Android和后退键的信息,这是我读过的最好的文章。

最新更新