原创Ionic单页应用跳转外链,构造路由返回的解决办法及代码

Posted 赵皖华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原创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:希望上面的方法对你们有所帮助

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






 

 

 

以上是关于原创Ionic单页应用跳转外链,构造路由返回的解决办法及代码的主要内容,如果未能解决你的问题,请参考以下文章

Vue如何引入外链css和js

ionic中,页面返回或者跳转,生命周期方法不生效的解决方案

小程序外链跳转web-view系列问题

解决vue单页路由跳转后scrollTop的问题

浅谈单页应用和多页应用——Vue.js向

路由到单独选项卡中的页面时没有后退按钮(单页应用程序)