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实现的页面关键字密度查询代码
Dec 27 Javascript
JS在textarea光标处插入文本的小例子
Mar 22 Javascript
JS中的构造函数详细解析
Mar 10 Javascript
javascript实现继承的简单实例
Jul 26 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
Sep 28 Javascript
浅析BootStrap模态框的使用(经典)
Apr 29 Javascript
深入理解Node.js中通用基础设计模式
Sep 19 Javascript
node puppeteer(headless chrome)实现网站登录
May 09 Javascript
解决axios发送post请求返回400状态码的问题
Aug 11 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
Dec 19 Javascript
openlayers 3实现车辆轨迹回放
Sep 24 Javascript
javascript实现多边形碰撞检测
Oct 24 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
模拟OICQ的实现思路和核心程序(一)
2006/10/09 PHP
php 正则表达式小结
2009/08/31 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
js判断密码强度的方法
2020/03/18 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
sqlalchemy对象转dict的示例
2014/04/22 Python
python通过smpt发送邮件的方法
2015/04/30 Python
python爬虫使用cookie登录详解
2017/12/27 Python
基于Python测试程序是否有错误
2020/05/16 Python
Python远程linux执行命令实现
2020/11/11 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
Windows和Linux动态库应用异同
2016/07/28 面试题
办公室前台岗位职责
2014/01/04 职场文书
出纳会计岗位职责
2014/03/12 职场文书
校庆标语集锦
2014/06/25 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
我的生日感言
2015/08/03 职场文书