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

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

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

解决思路:

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

  

 var storage = window. localStorage;

 var historyData = $ionicHistory.viewHistory();

 //将historyData从object转成JSON  
storage.setItem("historyData",Json.stringify(historyData)); 

  

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

  

 if(!$ionicHistory.backView()){

     var ViewArr = {};
  //将本地的historyData从json转成object 
var hisData = JSON.parse( window.localStorage.getItem('historyData'));
  //因为他的每个路由对象全是view类型,利用框架的createView构造history中的
  //所有的view,看清history对象的结构,不然很容易出错 。
   
  //在构造history中的views对象时,同时构造currentView,backView,forwardView
   for(var item in hisData.views){
ViewArr[item] = $ionicHistory.createView(hisData.views[item]);
     //构造currentView并赋值
if(hisData.currentView && hisData.currentView.viewId == ViewArr[item].viewId){
$ionicHistory.viewHistory().currentView = ViewArr[item];
}
     //构造backView并赋值
if(hisData.backView && hisData.backView.viewId == ViewArr[item].viewId){
$ionicHistory.viewHistory().backView = ViewArr[item];
}
     //构造forwardView并赋值
if(hisData.forwardView && hisData.forwardView.viewId == ViewArr[item].viewId){
$ionicHistory.viewHistory().forwardView = ViewArr[item];
}
}
  //构造history的histories对象
var ionicHis = {};
ionicHis['root'] = {};
ionicHis['root']['cursor'] = hisData.histories.root.cursor;
ionicHis['root']['historyId'] = hisData.histories.root.historyId;
ionicHis['root']['parentHistoryId'] = hisData.histories.root.parentHistoryId;
ionicHis['root']['stack'] = [];
if(hisData.histories.root && hisData.histories.root.stack && hisData.histories.root.stack.length){
for(var i = ; i < hisData.histories.root.stack.length ; i ++){
for(item in ViewArr){
if(hisData.histories.root.stack[i].viewId == ViewArr[item].viewId){
ionicHis['root']['stack'].push(ViewArr[item]);
}
}
}
}
   //赋值views对象
$ionicHistory.viewHistory().views = ViewArr;
   //赋值histories对象
$ionicHistory.viewHistory().histories = ionicHis;
}//这个时候,本地保存的之前的history就已经取出并且赋值给现在的history服务,这个时候就可以执行ioncHistory.goBack()
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;
}
}

 

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

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


【原创】Ionic单页应用跳转外链,构造路由返回的解决办法及代码的更多相关文章

  1. Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法(转)

    转载: Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法   首先感谢博主分享,本文作为学习记录 惊鸿一瞥 微信的启动页,相信大家都不陌生. 不知道大家有没有发现一个现象 ...

  2. react跳转url,跳转外链,新页面打开页面

    react中实现在js中内部跳转路由,有两种方法. 方法一: import PropTypes from 'prop-types'; export default class Header exten ...

  3. cordova-plugin-themeablebrowser 0.2.17 "ThemeableBrowser"ionic跳转外链插件在ios中heardBar会遮住内容的bug

    ionic+angular的app项目中需要在App打开一个外部的url链接,用了这个插件发现在iPhone手机中会出现toolbar挡住url页面内容 解决方法: 在原有基础上加上statusBar ...

  4. 单页应用跳转ui-view,$stateProvider,$urlRouterProvider

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta charset="UTF- ...

  5. HTTP协议之chunk,单页应用这样的动态页面,怎么获取Content-Length的办法

    当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-Length消息首部字段告诉客户端需要接收多少数据.但是如果是动态页面等时,服务器是不可能预先知 ...

  6. [原创]python MySQLdb在windows环境下的安装、出错问题以及解决办法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 问题:windows下安装MySQLdb的方法 解析:python没有php那种集成环境,比如wamp那种集成软件直接把所有需要的东西全部一次性搭 ...

  7. [原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法

    首先,请允许我说一句:shit! 因为这个问题不难,但是网上有关 ASP.NET WEBAPI的资料太少.都是PHP等等的. 我也是在看了某位大神的博客后有启发,一点点研究出来的. 来看正题! 1.微 ...

  8. JavaWeb -- http-equiv=refresh跳转的时候出现Session 丢失, 解决办法。。

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  9. [原创] Gradle DSL method not found: 'android()' 和 buildToolsVersion is not specified 的解决办法。

    今天在用Android Studio 2.0 打开别人的较早版本生成的工程时, 提示: Gradle DSL method not found: 'android()'. 解决办法为,打开根目录下面的 ...

随机推荐

  1. hadoop学习笔记--集群搭建

    注:大家常说的ssh其实就是一个免密码访问的东西,为了简化操作的,不用每次访问其他节点重新输入密码.但是要想配置如下: .在每台机器上执行 ssh-keygen -t rsa,连敲三次回车键(即设置空 ...

  2. ASP.NET - 自定义控件处理页面事件(控件与页面数据交互)的方法

    //用委托的方法实现 //控件代码 public delegate void DelegateFunction( string sPageTitle ); private DelegateFuncti ...

  3. Docker,容器,虚拟机和红烧肉

    Docker火了,有多火你自己看看下面的统计数据就知道了 在发布4个月的时间里,下载量就超过50000次,github上收到超过4000个star,涌现了超过100个贡献者,并且有超过150个项目和超 ...

  4. 多线程——NSThread

    创建和启动线程 一个NSThread对象就代表一条线程 // 创建.启动线程 NSThread *thread = [[NSThread alloc] initWithTarget:self sele ...

  5. DTLS 技术要点解析

    一.DTLS DTLS 是指 Datagram Transport Level Security,即数据报安全传输协议: 其提供了UDP 传输场景下的安全解决方案,能防止消息被窃听.篡改.身份冒充等问 ...

  6. IP数据报格式 及路由转发算法

    ip数据报分首部和数据两部分组成: 首部分为固定部分和可变部分 版本--占 4 位,指 IP 协议的版本 目前的 IP 协议版本号为 4 (即 IPv4) 首部长度--占 4 位,可表示的最大数值 是 ...

  7. bootstrap 响应式工具

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 使用ViewPagerAdapter 页面引导适配器设置app启动页,引导页面的实现

    一般的app第一次安装启动的时候,都会有一个启动页面和引导页的画面,然后才进入主程序.anndroid中的ViewPagerAdapter 是一个继承与PageAdapter的 页面引导适配器.由于我 ...

  9. 微信公众号平台接口开发:基础支持,获取access_token

    新建Asp.net MVC 4.0项目 WeChatSubscript是项目UI层 WeChatTools是封装操作访问公众号接口的一些方法类库 获取AccssToken 我们要的得到AccessTo ...

  10. 一个Python小白5个小时爬虫经历 【续】

    前言 昨天实现了python简单的数据采集之后本来还挺高兴的,结果发现在.NET读取txt文件后反序列化总是报错.具体错误原因好像是从txt读取数据之后会自动加一个隐藏的字符串,没错,肉眼看不见,就导 ...