在开发客户微信企业号的填单审批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. 数据库基础-JOIN

    JOIN分类 三.JOIN分类详解 INNER JOIN: 仅仅返回两个表中,匹配列相同的列值,所在行的数据. SELECT * FROM Table1 t1 INNER JOIN Table2 t2 ...

  2. JSON数据格式中的引号

    JSON数据中必须使用双引号: $.getJSON,的输入必须是正确的JSON数据,否则不会执行回调函数: $.parseJSON的输入必须是正确的JSON数据,否则会有异常:

  3. 二维动态规划——Palindrome

    Palindrome Description A palindrome is a symmetrical string, that is, a string read identically from ...

  4. loadrunner:参数类型及其取值机制

    参数类型 参数名随意取,建议取通俗易懂的名字,下面我们重点介绍一下参数的类型. ●DateTime: 很简单, 在需要输入日期/时间的地方, 可以用DateTime 类型来替代. 其属性设置也很简单, ...

  5. C++ 头文件系列(forward_list)

    简介 forwrad_list字面意思为前向列表,但实际上它是一种单向列表,只能从单一方向遍历. 单向链表实现 forward_list内部是用单向列表实现的,并且设计该库的时候就是以近乎手写的单向链 ...

  6. 从RPC开始(二)、序列化

    在C++的世界里构建一个序列化框架:并非一件困难的事情,但也并非简单.因此,需要分成两部分来完成这项任务: 1.序列化容器. 2.序列化方式. 前者,很容易理解:但也决定着我们将要存储数据的方式:二进 ...

  7. webSocket错误收集

    关于 使用WebSocket报如下错误, Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': already in ...

  8. 正则表达式之一:TSQL注释的查找

    最近自己做了个小项目,涉及到了大量的正则表达式匹配和处理,在这里也和大家分享一下. 我相信接触过SQL Server数据库的很多朋友都知道,它是以"--"开头来进行注释的,但你觉得 ...

  9. Windows 10 IoT Serials 4 - 如何在树莓派上使用Cortana语音助手

    从Windows 10 IoT Core 14986版本开始,微软已经加入Cortana语音助手功能.之前,我们只能使用本地语音识别,需要编写应用程序,下载到设备中才能实现.从现在开始,微软已经从系统 ...

  10. StringUtils工具类常用方法介绍(持续更新)

    StringUtils方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的(即如果输入参数String为null则不会抛出Nu ...