最近在做老项目优化,发现原本“返回上一页”的功能,非常凌乱、可读性很差。
具体的场景是这样的
A、B、C等多个页面都可以进入到D页面,D页面里有一个“返回上一页”功能,由于D页面里有iframe每次加载都会添加浏览记录,导致history.go(-1)不能返回想要的上一页。
于是全部通过一个historyUrlService
管理,在ABC页面跳转到D之前,保存来源,在D页面返回上一页的时候读取这个来源,然后手动进行跳转。
这个实现问题非常大,可能写的人熟悉业务觉得没问题,反正我看的时候全局搜索看了半天,如果再多几个入口和出口,基本就没人能看懂了吧。
我的解决方法是这样的
不要做这么多加法,回到最初的起点,浏览器默认的记录不好用就自己维护一套,需要回退的时候找出来加载就行了。
项目使用了ui.router,就结合这个库提供的路由事件 $stateChangeSuccess
它在路由转换完成后触发。
很简单的几行代码不需要太多说明,页面跳转完成之后保存这次的访问记录在 $rootScope.historyStack 数组里,返回上一级的时候先把当前页面的记录删掉,再获取上一个页面的记录并删掉,最后跳转过去
$rootScope.historyStack = $rootScope.historyStack