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 相关文章推荐
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
Mar 12 Javascript
javascript实现点击提交按钮后显示loading的方法
Jul 03 Javascript
jQuery增加自定义函数的方法
Jul 18 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
Sep 24 Javascript
JavaScript仿支付宝密码输入框
Dec 29 Javascript
jQuery版本升级踩坑大全
Jan 12 Javascript
javascript实现平滑无缝滚动
Aug 09 Javascript
在JSP中如何实现MD5加密的方法
Nov 02 Javascript
JavaScript 计算笛卡尔积实例详解
Dec 02 Javascript
详解基于node的前端项目编译时内存溢出问题
Aug 01 Javascript
浅谈sass在vue注意的地方
Aug 10 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
Apr 11 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
Angular整合zTree的示例代码
2018/01/24 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
python实现电子书翻页小程序
2019/07/23 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
兰兰过桥教学反思
2014/02/08 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
Python编程源码报错解决方法总结经验分享
2021/10/05 Python