【原创】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()'. 解决办法为,打开根目录下面的 ...
随机推荐
- webview 设置编码
WebSettings settings = webView.getSettings(); // 设置页面编码 settings.setDefaultTextEncodingName("ut ...
- libcurl模拟登录CSDN并自动评论资源以获取积分
软件及源码下载:(http://pan.baidu.com/s/1jGE52pK) 涉及到的知识点: C++多线程编程 libcurl的使用(包括发送http请求.发送cookie给服务器.保存coo ...
- LinuxMint18配置Grub2默认启动操作系统
---恢复内容开始--- 之前电脑里面装了太多系统太乱了,刚好假期回家有一些空闲时间于是开始了重装计划. 现在重新弄好了,有两个系统,一个是Windows10,另一个是LinuxMint18,但是我平 ...
- node源码详解(六) —— 从server.listen 到事件循环
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource6 本博客同步在https://cnodejs.o ...
- 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)
版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...
- java原装代码完成pdf在线预览和pdf打印及下载
这是我在工作中,遇到这样需求,完成需求后,总结的成果,就当做是工作笔记,以免日后忘记,当然,能帮助到别人是最好的啦! 下面进入正题: 前提准备: 1. 项目中至少需要引入的jar包,注意版本: a) ...
- asp.net权限认证:OWIN实现OAuth 2.0 之密码模式(Resource Owner Password Credential)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- github在windows下的安装和基本使用
1.在win下安装github时花费的时间是非常长的,有时还会出现因各种原因安装不成功.离线包本地安装方便的解决了此问题.点击http://pan.baidu.com/s/1boGrNLP可下载,解压 ...
- Hbase数据库安装
一.环境准备 1.Ubuntu14.04-server 2.ssh 3.jdk1.6 4.hbase-0.98.19-hadoop2-bin.tar.gz(下载地址http://www.apache. ...
- c# 读取app.config遇到生成X.config.config问题
string exePath = System.IO.Path.Combine(Environment.CurrentDirectory, "WindowsFormsApp.exe" ...