我希望能够覆盖导航栏上的BACK按钮和硬件按钮 .
我希望这个覆盖是针对一个特定的控制器,而不是其他控制器 .
- 当用户移动到另一个屏幕时必须取消它
(使用离子v1.0.0铀 - 独角兽)
我的理由是我有一个项目清单 . 单击列表将打开一个详细信息页面,其中包含3个选项卡 . 每个选项卡共享同一个控制器 .
但是,在任何这些选项卡上按BACK必须返回主列表 . 这就是它在本机设备上的工作方式,所以我希望它能够在我的混合应用程序上运行 .
在线提供的许多解决方案似乎适用于较旧的beta版本,或用于控制器之外的注册 .
在控制器内使用Android硬件按钮的常见解决方案是:
$ionicPlatform.registerBackButtonAction(function (event) {
if($state.current.name=="home"){
alert("button back");
}
}, 100);
然而,这似乎不适用于软导航栏按钮,它适用于所有控制器,而不仅仅是一个控制器 .
6 回答
It is possible to override both buttons in your controller ,没有对HTML代码进行任何更改 .
总结一下:
软导航栏按钮 - 覆盖
$rootScope.$ionicGoBack()
硬Android按钮 - 使用
$ionicPlatform.registerBackButtonAction()
详细解释如下 .
overriding the soft navigation bar BACK button 的解决方案来自于了解按下该按钮后Ionic的作用 .
从Ionic docs for ion-nav-back-button,我们已经知道:
在ionic.bundle.js中搜索源代码可以揭示如何声明:
在您自己的控制器中覆盖它很简单 . 确保将
$rootScope
传递给控制器,然后修改上面的代码 . grab 指向原始函数的指针是个好主意,以便在需要时可以恢复它,或者在完成自定义处理后调用它 .对于一个控制器, overriding the Android hardware BACK button 的解决方案来自
registerBackButtonAction()
函数的返回值,该函数执行覆盖的注销 .在
$scope.$on('$destroy'...
处理程序中调用该注销方法 .更多细节在这里:
完整的解决方案需要以下内容:
覆盖软导航栏BACK按钮
覆盖Android硬BACK按钮
范围将是单个控制器
恢复了默认行为
以下代码说明了如何完成此操作:
此问题已在Ionic论坛和问题页面上讨论过:
How to handle a click on the generated back button?
Custom back button onclick #438
我接受了理查德的建议,并将其投入服务,使其更具可重用性 .
The Controller
The Service
您是在谈论离线 Headers 栏或离子导航条上的后退按钮中的软导航?因为这是一个简单的解决方案 . 只需为该模板创建自己的自定义 Headers 栏 . 那么状态模板只是使用这样的东西 .
以上回答覆盖$ rootScope . $ ionicGoBack部分有效 .
问题在于deregisterSoftBack的方式 . 我尝试了上面提到的$ scope . $ on('$ destroy',a_function)以及新的$ scope . $ on('$ ionicView.beforeLeave',a_function),都不起作用 .
原因是:新的控制器将在deregisterSoftBack之前输入,从而使取消注册失败 . 所以我稍微修改了解决方案以使其工作 .
至
这是我的解决方案:)
将这部分代码放在app.js运行函数中:
现在,您可以在控制器中创建自定义goback功能:
当用户点击导航后退按钮时,将自动调用此功能 .
如果你想自己打电话给goBack,可以这样做:
如果你想绕过自定义函数而声明它,你可以去:
您可以直接在每个控制器中为后退按钮分配不同的行为:)
从@ raven.zuo那里得到反馈并做了一些修改以取消注册状态变化事件 .