zoukankan      html  css  js  c++  java
  • 【原创】Ionic单页应用跳转外链,构造路由返回的解决办法及代码

    在开发客户微信企业号的填单审批webApp的时候出现了一个问题:

    单据是带有附件的,而且存在各种不同的格式,需要后台处理后给前台链接地址,点击预览,微信浏览器的特性就是只能存在一个浏览器窗口,

    这导致了如果我们的webApp应用跳转到外链(比如百度,不在应用的路由中)之后,在点击微信浏览器的返回后,因为没有路由,导致的无法返回之前的路径。

    解决思路:

     1.在跳转外链之前,先将之前的state历史保存到localStorage   ==》

      

    1 var storage = window. localStorage;
    2 
    3 var historyData = $ionicHistory.viewHistory();
    4 
    5 //将historyData从object转成JSON  
    6 storage.setItem("historyData",Json.stringify(historyData)); 
    View Code

      

     2.从外链返回后 进入控制器,通过$ionicHistory.backView()判断是否是从外链返回的,如果是,获取本地historyData,构造历史路由  

      

     1 if(!$ionicHistory.backView()){
     2 
     3     var ViewArr = {};
     4   //将本地的historyData从json转成object 
     5     var hisData = JSON.parse( window.localStorage.getItem('historyData'));
     6   //因为他的每个路由对象全是view类型,利用框架的createView构造history中的
     7   //所有的view,看清history对象的结构,不然很容易出错 。
     8    
     9   //在构造history中的views对象时,同时构造currentView,backView,forwardView  
    10    for(var item in hisData.views){
    11         ViewArr[item] = $ionicHistory.createView(hisData.views[item]);
    12      //构造currentView并赋值
    13         if(hisData.currentView && hisData.currentView.viewId == ViewArr[item].viewId){
    14             $ionicHistory.viewHistory().currentView = ViewArr[item];
    15         }
    16      //构造backView并赋值
    17         if(hisData.backView && hisData.backView.viewId == ViewArr[item].viewId){
    18             $ionicHistory.viewHistory().backView = ViewArr[item];
    19         }
    20      //构造forwardView并赋值
    21         if(hisData.forwardView && hisData.forwardView.viewId == ViewArr[item].viewId){
    22             $ionicHistory.viewHistory().forwardView = ViewArr[item];
    23         }
    24     }
    25   //构造history的histories对象
    26     var ionicHis = {};
    27     ionicHis['root'] = {};
    28     ionicHis['root']['cursor'] = hisData.histories.root.cursor;
    29     ionicHis['root']['historyId'] = hisData.histories.root.historyId;
    30     ionicHis['root']['parentHistoryId'] = hisData.histories.root.parentHistoryId;
    31     ionicHis['root']['stack'] = [];
    32     if(hisData.histories.root && hisData.histories.root.stack && hisData.histories.root.stack.length){
    33         for(var i = 0; i < hisData.histories.root.stack.length ; i ++){
    34             for(item in ViewArr){
    35                 if(hisData.histories.root.stack[i].viewId == ViewArr[item].viewId){
    36                     ionicHis['root']['stack'].push(ViewArr[item]);
    37                 }
    38             }
    39         }
    40     }
    41    //赋值views对象
    42     $ionicHistory.viewHistory().views = ViewArr; 
    43    //赋值histories对象
    44     $ionicHistory.viewHistory().histories = ionicHis;
    45 }//这个时候,本地保存的之前的history就已经取出并且赋值给现在的history服务,这个时候就可以执行ioncHistory.goBack()
    View Code
    3.设置backButton的样式为显示,这样就OK了

    4.如果出现路由混乱的问题,也请不必担心,这是ionic框架没有对我们自定义构造路由历史进行处理时候做判断,只需在ionic.bundle.js里面加上一段代码就好
     // set a new unique viewId
              // viewId = ionic.Utils.nextUid();
              //Mouse 2017年3月13日01:03:55
              //重新构造的view id 在 next id中不存在,导致计算出重复的viewId,增加判断避免该问题的发生
              var viewId = '';
              while(true){
                  viewId = ionic.Utils.nextUid();
                  if(!viewHistory.views[viewId]){
                      break;
                  }
              }
    View Code
    
    

     

      END:希望上面的方法对你们有所帮助

      原创文章,转载请标清出处,谢谢!






    我的segmentfault地址 : https://segmentfault.com/u/winward
  • 相关阅读:
    AC日记——接苹果 洛谷 P2690
    AC日记——友好城市 洛谷 P2782
    AC日记——栈 洛谷 P1044
    AC日记——L国的战斗之间谍 洛谷 P1916
    AC日记——[USACO1.1]坏掉的项链Broken Necklace 洛谷 P1203
    AC日记——[USACO1.5]数字三角形 Number Triangles 洛谷 P1216
    Codevs 1048 石子归并
    Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组
    HDU 1575 Tr A
    Codevs 5059 一起去打CS
  • 原文地址:https://www.cnblogs.com/zwhblog/p/6542080.html
Copyright © 2011-2022 走看看