我有一个奇怪的情况。我正在写一个带有左滑动菜单的角度+离子应用程序,这就是我想要做的事情:
1)陷阱Android后退按钮 2)当您点击后退按钮时,如果菜单未打开,请转到菜单(打开它) 3)如果菜单打开并按下后退按钮,则退出应用程序
要捕获后退按钮,我在app.run中有这个代码(也尝试重新定位到基本控制器并将$ controller注入其他控制器,没有什么区别)
我注意到的是,如果我实际点击“菜单”图标'菜单中," isOpen"当我打开和关闭菜单时,可以交替地打印真/假
但是,当我点击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上点击后退按钮时,它会让浏览器返回页面。
对正在发生的事情的任何见解?我已经在离子论坛上问过,但是还没有找到原因(还) - >因此,它希望它能够覆盖更广泛的受众。
答案 0 :(得分:7)
registerBackButtonAction
需要priority来覆盖其他操作:
现有后退按钮挂钩的优先级如下: 返回上一个视图= 100关闭侧边菜单= 150关闭模式= 200关闭操作表= 300关闭弹出= 400关闭加载 overlay = 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()
但您也可以将其更改为使用right菜单。
<强>更新强>:
如果有兴趣了解有关Android和Back Button的更多信息,这是迄今为止我读过的最好的article。