IONIC导航栏跳转同步

作者: 烈风裘 | 来源:发表于2016-06-02 23:22 被阅读839次

问题点

  • 在开发微信微官网的时候,会同时存在两个导航栏的情况:微信自带导航栏和WebApp内建导航栏。按照常理两者导航结果要同步才能达到体验一致的效果。
  • ionic使用的导航方式永远都是在新增历史记录($ionicHistory.goBack(-1)),而浏览器原生的导航则是在历史记录中有前有后的跳转,因而使用$ionicHistory会在用户操作的过程出现导航不同步的现象。
  • "返回"可以用history.go(-1)解决,但是“返回首页”的问题就有些棘手,因为返回首页的另一个意思就是,返回历史记录的第一个页面,如果第一个页面不是“home”,那就将第一个页面换成“home”。

解决方案

  • 内建数组维护历史记录,监听$locationChangeSuccess事件,当path改变就对内建历史记录进行更新,东西不难拿笔画画流程就清楚了。
  • 方法backToHome返回首页goBack后退HistoryArr维护历史记录
  • 上面两个方法挂载到mainCtrl根控制器的$rootScope下,这样的话在别的controller中也可手动调用此方法。

代码实现

 angular.module('controllers')
        .controller('mainCtrl', ['$scope', '$sessionStorage', '$state', '$ionicHistory', '$rootScope', '$log', '$timeout', '$window', '$location', function ($scope, $sessionStorage, $state, $ionicHistory, $rootScope, $log, $timeout, $window, $location) {
            /**
             * 定义后退和返回操作
             * */
            $rootScope.HistoryArr = [];
            $rootScope.$on("$locationChangeSuccess", function () {
                var currentPath = $location.path();
                //倒数第一个
                var back1Path = $rootScope.HistoryArr[$rootScope.HistoryArr.length-1];
                //如果是后退的情况,则不记录历史记录
                if($rootScope.HistoryArr.length>1){
                    //倒数第二个
                    var back2Path = $rootScope.HistoryArr[$rootScope.HistoryArr.length-2];
                    if(currentPath != back1Path){
                        if(currentPath != back2Path){
                            //前进状态
                            $rootScope.HistoryArr.push(currentPath);
                        }else{
                            //激活了浏览器的后退,这里只需要更新状态
                            $rootScope.HistoryArr.length = $rootScope.HistoryArr.length-1;
                        }
                    }else{
                        //当前状态就是数组的最后一个,这里不做处理
                    }
                }else{
                    if(back1Path != currentPath){
                        $rootScope.HistoryArr.push(currentPath);
                    }
                }
            });

            /**
             * backToHome
             * */
            $rootScope.backToHome = function () {
                var len = $rootScope.HistoryArr.length;
                //截断
                $rootScope.HistoryArr.length = 1;
                //直接回到第一个页面,一定是主页
                //如果不是home则转到home
                //因为bug,无奈之举
                if( $rootScope.HistoryArr[0] != "/home"){
                    $rootScope.HistoryArr.length = 0;
                    $location.path('/home');
                }else{
                    $window.history.go(1 - len);
                }
            };


            /**
             * 定义上一个视图,受体在subNavPage.html
             * */
            $rootScope.goBack = function (step) {
                !step && (step = 1);
                step = parseInt(step);
                if(isNaN(step)){
                    return "step must be a number";
                }
                //截断
                $rootScope.HistoryArr.length = $rootScope.HistoryArr.length-step;
                $window.history.go(-(step));
            };
        }]);

相关文章

  • IONIC导航栏跳转同步

    问题点 在开发微信微官网的时候,会同时存在两个导航栏的情况:微信自带导航栏和WebApp内建导航栏。按照常理两者导...

  • iO 关于NavigationBar、NavigationIte

    前言:经常遇到这样的需求:从有导航栏的界面跳转到导航栏透明的界面,由于iOS从有导航栏跳转到透明导航栏界面,并且设...

  • SwiftUI页面跳转

    NavigationView导航栏,NavigationLink页面跳转,navigationBarTitle导航...

  • iOS开发-模态视图跳转

    iOS开发中界面的跳转一般都会使用导航栏UINavigationController来进行push跳转,使用导航栏...

  • 特大新闻

    导航库React Navigation 功能:1.跳转页面 2.底部导航栏 3.顶部导航栏...

  • 参考笔记

    导航库React Navigation 功能:1.跳转页面 2.底部导航栏 3.顶部导航栏...

  • iOS导航栏隐藏透明处理

    1: 导航栏隐藏之间跳转 & 导航栏隐藏后显示自定义导航栏(由于系统导航栏透明造成的动画问题 暂时还未找到...

  • 关于路由跳转导航栏消失的问题

    问题描述: 在做后台管理页面的时候,使用路由跳转的时候,点击导航栏的菜单项,是跳转了,可是页面直接跳转了,导航栏不...

  • React-Native 相关小知识

    1、界面跳转 (1)导航栏传值

  • 【原】swift基础篇之页面跳转

    常用的跳转方法有四种:present、dissmiss、push、pop.前两中不含导航栏跳转、后两种导航栏 1....

网友评论

    本文标题:IONIC导航栏跳转同步

    本文链接:https://www.haomeiwen.com/subject/cfvkdttx.html