【原创】Ionic单页应用跳转外链,构造路由返回的解决办法及代码
在开发客户微信企业号的填单审批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单页应用跳转外链,构造路由返回的解决办法及代码的更多相关文章
- Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法(转)
转载: Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法 首先感谢博主分享,本文作为学习记录 惊鸿一瞥 微信的启动页,相信大家都不陌生. 不知道大家有没有发现一个现象 ...
- react跳转url,跳转外链,新页面打开页面
react中实现在js中内部跳转路由,有两种方法. 方法一: import PropTypes from 'prop-types'; export default class Header exten ...
- cordova-plugin-themeablebrowser 0.2.17 "ThemeableBrowser"ionic跳转外链插件在ios中heardBar会遮住内容的bug
ionic+angular的app项目中需要在App打开一个外部的url链接,用了这个插件发现在iPhone手机中会出现toolbar挡住url页面内容 解决方法: 在原有基础上加上statusBar ...
- 单页应用跳转ui-view,$stateProvider,$urlRouterProvider
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta charset="UTF- ...
- HTTP协议之chunk,单页应用这样的动态页面,怎么获取Content-Length的办法
当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-Length消息首部字段告诉客户端需要接收多少数据.但是如果是动态页面等时,服务器是不可能预先知 ...
- [原创]python MySQLdb在windows环境下的安装、出错问题以及解决办法
版权声明:本文为博主原创文章,未经博主允许不得转载. 问题:windows下安装MySQLdb的方法 解析:python没有php那种集成环境,比如wamp那种集成软件直接把所有需要的东西全部一次性搭 ...
- [原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法
首先,请允许我说一句:shit! 因为这个问题不难,但是网上有关 ASP.NET WEBAPI的资料太少.都是PHP等等的. 我也是在看了某位大神的博客后有启发,一点点研究出来的. 来看正题! 1.微 ...
- JavaWeb -- http-equiv=refresh跳转的时候出现Session 丢失, 解决办法。。
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- [原创] Gradle DSL method not found: 'android()' 和 buildToolsVersion is not specified 的解决办法。
今天在用Android Studio 2.0 打开别人的较早版本生成的工程时, 提示: Gradle DSL method not found: 'android()'. 解决办法为,打开根目录下面的 ...
随机推荐
- datatable 使用详细说明
要注意的是,要被dataTable处理的table对象,必须有thead与tbody,而且,结构要规整(数据不一定要完整),这样才能正确处理.以下是在进行dataTable绑定处理时候可以附加的参数: ...
- jQuery事件触发和参数传递
jQuery事件触发和参数传递: 参考:http://www.jb51.net/article/36249.htm <%@ page language="java" impo ...
- Android中SharedPreferences介绍和使用方法
1.SharedPreferences简介 为了保存软件的设置参数,Android 平台为我们提供了一个SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使 ...
- aJax请求结果中包含form的问题
jsp页面a.jsp如下: <form action='login' id='formId' method='post'> <input name='user'> </f ...
- 抓取QQ空间相册
某天,想下载某人的相册,发现一张一张下载,工作量巨大,所以写了这个工具. 使用到的工具 Fiddler(抓包工具) python(脚本语言) intellij 步骤 分析包 获取相册分类链接信息 打开 ...
- 选择法排序 vb.net
Imports System.ThreadingModule Module1 Sub Main() 'test code 'Dim a, b As Integer ...
- GDB中的backtrace命令
backtrace命令,可以用于回溯函数调用栈. 例如:当出现段错误的时候,执行backtrace,可以看到是哪里的调用,产生的这个段错误.
- Cms 总结(转)
提起开源cms,大家第一想到的是php的cms,因为php开源的最早,也最为用户和站长们认可,随着各大cms系统的功能的不断完善和各式各样的开源cms的出现,.net和java的高端的cms系统也逐渐 ...
- ACM 刷题小技巧【转】
转载自URl-team ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好 ...
- jq实战-表单验证
作为学习的记录,方便大家查看,废话不多说,直接上代码 html 结构: <form action="a.php" method="" class=&quo ...