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 相关文章推荐
php析构函数的具体用法小结
Mar 11 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
May 05 Javascript
Node.js实现在目录中查找某个字符串及所在文件
Sep 03 Javascript
jQuery实现带滚动线条导航效果的方法
Jan 30 Javascript
JavaScript实现SHA-1加密算法的方法
Mar 11 Javascript
js实现的早期滑动门菜单效果代码
Aug 27 Javascript
Angular.js跨controller实现参数传递的两种方法
Feb 20 Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 Javascript
小程序采集录音并上传到后台
Nov 22 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
用js实现放大镜效果
Oct 28 Javascript
Vue仿百度搜索功能
Dec 28 Vue.js
搭建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 error_log 函数的使用
2009/04/13 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
浅谈php提交form表单
2015/07/01 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
js取得url地址参数实例
2013/02/22 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
澳大利亚最早和最古老的巨型游戏专家:Yardgames
2020/02/20 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
应届大专毕业生个人自荐信
2013/09/22 职场文书
个人委托书格式
2014/04/04 职场文书
艺人经纪人岗位职责
2014/04/15 职场文书
企业安全生产承诺书
2014/05/22 职场文书
学生党员公开承诺书
2014/05/28 职场文书
工会工作先进事迹
2014/08/18 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js