美文网首页
angularJs返回时不要重新走生命周期

angularJs返回时不要重新走生命周期

作者: 冷鸢J | 来源:发表于2018-09-27 09:36 被阅读0次

    前言

    ​ 在使用angularJS过程中发现,在路由过程中,如果使用window.hostory.back()返回上一层界面,上层界面还是会重新走生命周期.

    ​ 因为之前双层路由嵌套的时候,希望可以通过内层路由来控制外层路由,本来自己写了一个事件总线进行控制,但是每次界面展示的时候事件总线都触发,所以导致了各种问题,虽然后来通过其他方法解决了需求,但是还是对界面的生命周期控制产生了疑问.

    ​ 在此文章中记录一下保存界面状态的方法(怎么让OnInit只走一次)

    ​ angularJS中可以通过控制路由复用策略来控制界面是否重新加载

    路由复用策略

    ​ RouteReuseStrategy类实现了路由复用的接口,我们继承这个类可以实现对路由的控制,这个类实现了如下方法:

    • shouldDetach 是否允许路由复用
    • store 路由离开时触发,存储路由
    • shouldAttach 是否允许还原路由
    • retrieve 获取存储的路由
    • shouldReuseRoute 进入路由触发,如果是同一路由,则允许进行路由数据还原

    ​ 方法执行顺序:

    1. 进入某个路由,触发shouldReuseRoute,遍历当前路由与前往路由并进行对比,一致时确认允许路由数据进行还原
    2. retrieve 获取当前路由的备份,没有备份则走生命周期
    3. shouldDetach 看是否允许路由复用
    4. store 存储离开的路由
    5. shouldAttach 设置是否允许还原

    自定义路由复用策略

    ​ 自己简单注释的路由策略

    import { RouteReuseStrategy, ActivatedRouteSnapshot, DetachedRouteHandle } from '@angular/router';
    import { route_strategy } from '../config';
    
    /**
     * 简单的路由复用策略
     * 使用:
     *     在路由层的provider中添加:{ provide: RouteReuseStrategy, useClass: SimpleReuseStrategy }
     * @export
     * @class SimpleReuseStrategy
     * @implements {RouteReuseStrategy}
     */
    export class SimpleReuseStrategy implements RouteReuseStrategy {
      _cacheRouters: { [key: string]: any } = {};
    
    
      /**
       *  是否允许路由复用
       *  统一配置放在config文件中
       *  单读修改配置可在路由中加入 data:{keep:boolean}
       *
       * @param {ActivatedRouteSnapshot} route
       * @returns {boolean} {true}允许复用 {false}不允许复用
       * @memberof SimpleReuseStrategy
       */
      shouldDetach(route: ActivatedRouteSnapshot): boolean {
        if (route.data.keep) {
          return route.data.keep
        }
        return route_strategy;
      }
    
      /**
       * 路由离开时触发,存储路由
       *
       * @param {ActivatedRouteSnapshot} route 离开的路由
       * @param {DetachedRouteHandle} handle
       * @memberof SimpleReuseStrategy
       */
      store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void {
        //当复用策略设置为true
        //或者设置不是false而默认配置是true时
        //存储路由
        if (route.data.keep === true || (route.data.keep != false && route_strategy)) {
          this._cacheRouters[route.routeConfig.path] = { snapshot: route, handle: handle };
        }
      }
    
      /**
       * 是否允许还原路由
       * 此处只要存储了路由,就允许还原
       * !!可将任意类型转化为boolean类型
       *
       * @param {ActivatedRouteSnapshot} route 前往的路由
       * @returns {boolean} {true}还原  {false}不还原
       * @memberof SimpleReuseStrategy
       */
      shouldAttach(route: ActivatedRouteSnapshot): boolean {
        return !!this._cacheRouters[route.routeConfig.path];
      }
    
      /**
       * 获取存储的路由
       *
       * @param {ActivatedRouteSnapshot} route
       * @returns {DetachedRouteHandle}
       * @memberof SimpleReuseStrategy
       */
      retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle {
        if (this._cacheRouters[route.routeConfig.path]) {
          return this._cacheRouters[route.routeConfig.path].handle
        }
        return null;
      }
    
      /**
       * 进入路由触发,如果是同一路由,则允许进行路由数据还原
       *
       * @param {ActivatedRouteSnapshot} future
       * @param {ActivatedRouteSnapshot} curr
       * @returns {boolean}
       * @memberof SimpleReuseStrategy
       */
      shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {
        return future.routeConfig === curr.routeConfig;
      }
    }
    
    

    ​ 此路由策略比较简单,通过config下的route_strategy和路由内部配置data:{keep:boolean} 控制路由的复用

    ​ 使用时只需要在载入路由的module中添加

    { provide: RouteReuseStrategy, useClass: SimpleReuseStrategy }

    如果遇到问题,请留言或私信讨论

    相关文章

      网友评论

          本文标题:angularJs返回时不要重新走生命周期

          本文链接:https://www.haomeiwen.com/subject/hkwsoftx.html