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 相关文章推荐
javascript高亮效果的二种实现方法
Sep 14 Javascript
js根据日期判断星座的示例代码
Jan 23 Javascript
json属性名为什么要双引号(个人猜测)
Jul 31 Javascript
jQuery实现的一个自定义Placeholder属性插件
Aug 11 Javascript
jQuery+PHP实现动态数字展示特效
Mar 14 Javascript
JQuery 的跨域方法推荐_可跨任何网站
May 18 Javascript
jQuery获取select选中的option的value值实现方法
Aug 29 Javascript
weui框架实现上传、预览和删除图片功能代码
Aug 24 Javascript
Angular实现的table表格排序功能完整示例
Dec 22 Javascript
vue中关闭eslint的方法分析
Aug 04 Javascript
在vue项目中引用Iview的方法
Sep 14 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
Dec 02 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
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
javascript instanceof,typeof的区别
2010/03/24 Javascript
jquery $.each() 使用小探
2013/08/23 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
详解JS函数stack size计算方法
2018/06/18 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
JavaScript实现打砖块游戏
2020/02/25 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
vue-i18n实现中英文切换的方法
2020/07/06 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
python使用webbrowser浏览指定url的方法
2015/04/04 Python
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
Python callable()函数用法实例分析
2018/03/17 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
证券期货行业个人的自我评价
2013/12/26 职场文书
卖车协议书
2014/04/21 职场文书
保密工作承诺书
2014/08/29 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
导游词格式
2015/02/13 职场文书
500字小学生检讨书
2015/02/19 职场文书
不同意离婚代理词
2015/05/23 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python