Angularjs实现页面模板清除的方法


Posted in Javascript onJuly 20, 2018

前几天项目在上线过程中,出现了一些新问题。页面在切换时由于前一个页面的模板清理不及时,会造成页面的重叠。导致这个问题的原因是:页面模板缓存,即上一个页面退出时,浏览器没有及时清空上一个页面的模板,导致新页面加载时,旧页面模板依然存在,从而页面出现重叠。

模板缓存清除:

模板缓存的清除包括传统的 HTML标签设置清除缓存,以及angularJs的一些配置清除,和angularJs的路由切换清除

1、以下是传统的清除浏览器的方法

HTMLmeta标签设置清除缓存

<!-- 清除缓存 -->
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

清理form表单临时缓存

<body onLoad="javascript:document.formName.reset()">

2、angularJs配置清除缓存

1、清除路由缓存,在route路由配置中,注入$httpProvider服务,通过$httpProvider服务配置,清除路由缓存。

app.config(["$stateProvider","$urlRouterProvider",'$locationProvider','$httpProvider',function ($stateProvider, $urlRouterProvider,$locationProvider,$httpProvider) {
  if (!$httpProvider.defaults.headers.get) {
    $httpProvider.defaults.headers.get = {};
  }
  $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
  $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
  $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);

2、用随机数,随机数也是一种很不错避免缓存的的方法,即在链接 URL 参数后加上随机数(一般加时间戳) 。用随机时间,和随机数一样。

3、在状态路由配置中,将cache配置项,配置为false。

.state("discountCoupon", {
  url: "/discountCoupon",
  templateUrl: "discountCoupon.html?" + new Date().getTime(),
//随机数
  controller: 'discountCoupon',
  cache: false,

//cache配置
})
.state("customerPhone", {
  url: "/customerPhone",
  templateUrl: "customerPhone.html?" + new Date().getTime(),

//随机数
  controller: 'customerPhone',
  cache: false,

//cache配置
})

3、angularJs的路由切换清除缓存

angularJs默认 模板加载都会被缓存起来,使用的缓存服务是 $tempalteCache, 发送模板请求的服务是$templateRequest,所以可以在路由切换时将上一个页面的模板清除:

1.每次发送 $http 请求模板完成后,可以调用 $tempalteCache.remove(url)  或 $tempalteCache. removeAll 清除所有模板缓存。

$rootScope.$on('$stateChangeStart',   //路由开始切换
  function (event, toState, toParams, fromState, fromParams) {
    //路由开始切换,清除以前所有模板缓存
    if (fromState.templateUrl !== undefined) {
      $templateCache.remove(fromState.templateUrl);
      // $templateCache.removeAll();
    }
  });
$rootScope.$on('$stateChangeSuccess',    //路由切换完成
  function (event, toState, toParams, fromState, fromParams) {
  //路由切换成功,清除上一个页面模板缓存
  if (fromState.templateUrl !== undefined) {
    $templateCache.remove(fromState.templateUrl);
    // $templateCache.removeAll();
  }
});

2.使用 $provide.decorator 改写原生的 $templateRequest (angularJs 自带 $provide服务里  $templateRequest: $TemplateRequestProvider)服务。在 $TemplateRequestProvider 服务里面我们可以看到默认使用了 $tempalteCache (本质还是 angularJs 的  $cacheFactory 服务) 服务,

this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) {
  function handleRequestFn(tpl, ignoreRequestError) {
    handleRequestFn.totalPendingRequests++;

并在获取模板时,默认以 $templateCache 作为 cache使用,将获取到的模板数据,添加到 $templateCache内保存。

return $http.get(tpl, extend({
  cache: $templateCache,
  transformResponse: transformResponse
}, httpOptions))
  ['finally'](function () {
  handleRequestFn.totalPendingRequests--;
})
  .then(function (response) {
    $templateCache.put(tpl, response.data);
    return response.data;
  }, handleError);

所以可以通过禁掉缓存,在 $templateRequest 的源码中将 $tempalteCache去掉,达到清除模板缓存的目的,不过这个一般不建议直接修改框架源代码!

总结

以上所述是小编给大家介绍的Angularjs实现页面模板清除的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
prototype 的说明 js类
Sep 07 Javascript
jQuery 动画基础教程
Dec 25 Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
Jul 29 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
Jun 24 Javascript
加载列表时jquery获取ul中第一个li的属性
Nov 02 Javascript
javascript将url中的参数加密解密代码
Nov 17 Javascript
jQuery表单美化插件jqTransform使用详解
Apr 12 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
Jun 11 Javascript
原生JS轮播图插件
Feb 09 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
Apr 24 jQuery
Windows安装Node.js报错:2503、2502的解决方法
Oct 25 Javascript
Vue extend的基本用法(实例详解)
Dec 09 Javascript
搭建vue开发环境
Jul 19 #Javascript
jQuery实现表单动态添加数据并提交的方法
Jul 19 #jQuery
微信小程序项目实践之九宫格实现及item跳转功能
Jul 19 #Javascript
js调用设备摄像头的方法
Jul 19 #Javascript
微信小程序定位当前城市的方法
Jul 19 #Javascript
微信小程序表单验证form提交错误提示效果
Jun 19 #Javascript
js中split()方法得到的数组长度问题
Jul 19 #Javascript
You might like
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
Redis在Laravel项目中的应用实例详解
2017/08/11 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
浅说js变量
2011/05/25 Javascript
js中function()使用方法
2013/12/24 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
python中logging包的使用总结
2018/02/28 Python
pandas object格式转float64格式的方法
2018/04/10 Python
python自动查询12306余票并发送邮箱提醒脚本
2018/05/21 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
2014年租房协议书范本
2014/10/30 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android