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 相关文章推荐
脚本吧 - 幻宇工作室用到js,超强推荐base.js
Dec 23 Javascript
Javascript 网页水印(非图片水印)实现代码
Mar 01 Javascript
textarea中的手动换行处理的jquery代码
Feb 26 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
Jul 31 Javascript
JavaScript中具名函数的多种调用方式总结
Nov 08 Javascript
javascript实现类似百度分享功能的方法
Jul 27 Javascript
jquery实现具有嵌套功能的选项卡
Feb 12 Javascript
深入理解Ajax的get和post请求
Jun 02 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
Vue中使用clipboard实现复制功能
Sep 05 Javascript
Vue中全局变量的定义和使用
Jun 05 Javascript
Javascript幻灯片播放功能实现过程解析
May 07 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初学者们头痛的十四个问题
2007/01/15 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
新手入门常用代码集锦
2007/01/11 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
JS前端加密算法示例
2016/12/22 Javascript
利用vue.js插入dom节点的方法
2017/03/15 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
Python中使用动态变量名的方法
2014/05/06 Python
python分割文件的常用方法
2014/11/01 Python
简单介绍Python的Django框架加载模版的方式
2015/07/20 Python
python tkinter界面居中显示的方法
2018/10/11 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
python和php学习哪个更有发展
2020/06/17 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
留学推荐信写作指南
2014/01/25 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
行风评议整改报告
2014/11/06 职场文书
事业单位个人总结
2015/02/12 职场文书
员工开除通知书
2015/04/25 职场文书
勇敢的心观后感
2015/06/09 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书