AngularJS 防止页面闪烁的方法


Posted in Javascript onMarch 09, 2017

我们知道在应用的页面或者组件需要加载数据时,浏览器和angular渲染页面都需要消耗一定的时间。这里的间隔可能很小,甚至让人感觉不到区别;但也可能很长,这样会导致让我们的用户看到了没有被渲染过的页面。

这种情况被叫做Flash Of Unrendered Content (FOUC)(K)?and is always unwanted.下面我们将要介绍几个不同的方式防止这种情况发生在我们的用户身上。

1、ng-cloak

ng-cloak指令是angular的内置指令,它的作用是隐藏所有被它包含的元素:

<div ng-cloak>
 <h1>Hello {{ name }}</h1>
</div>

在浏览器加载和编译渲染完成之后,angular会自动删除ngCloak元素属性,这样这个元素就会变成可见的。

在IE7里面使用ng-cloak的安全方式是给元素多加一个ng-cloak class

<div ng-cloak class="ng-cloak">
 <h1>Hello {{ name }}</h1>
</div>

2、ng-bind

ng-bind是angular里面另一个内置的用于操作绑定页面数据的指令。我们可以使用ng-bind代替{{ }}的形式绑定元素到页面上;

使用ng-bind替代{{  }}可以防止未被渲染的{{ }}就展示给用户了,使用ng-bind渲染的空元素替代{{ }}会显得友好很多。

上面的例子可以重写成下面那样,这样就可以防止页面出现{{ }}了

<div>
 <h1>Hello <span ng-bind="name"></span></h1>
</div>

3、resolve

当在不同的页面之间使用routes(路由)的时候,我们有另外的方式防止页面在数据被完全加载到route之前被渲染。

在route(路由)里使用resolve可以让我们在route(路由)被完全加载之前获取我们需要加载的数据。当数据被加载成功之后,路由就会改变而页面也会呈现给用户;数据没有被加载成功route就不会改变, the $routeChangeError event will get fired.【$routeChangeError事件就(不)会被激活?】

angular.module('myApp', ['ngRoute'])
.config(function($routeProvider) {
 $routeProvider
 .when('/account', {
  controller: 'AccountCtrl',
  templateUrl: 'views/account.html',
  resolve: {
   // We specify a promise to be resolved
   account: function($q) {
    var d = $q.defer();
    $timeout(function() {
     d.resolve({
      id: 1,
      name: 'Ari Lerner'
     })
    }, 1000);
    return d.promise;
   }
  }
 })
});

resolve 项需要一个key/value对象,key是resolve依赖的名称,value可以是一个字符串(as a service)或者一个返回依赖的方法。

resolve is very useful when the resolve value returns a promise that becomes resolved or rejected.

当路由加载的时候,resolve参数里的keys可以作为可注入的依赖:

angular.module('myApp')
.controller('AccountCtrl', 
 function($scope, account) {
  $scope.account = account;
});

我们同样可以使用resolve key传递$http方法返回的结果,as $http returns promises from it's method calls:

angular.module('myApp', ['ngRoute'])
.config(function($routeProvider) {
 $routeProvider
 .when('/account', {
  controller: 'AccountCtrl',
  templateUrl: 'views/account.html',
  resolve: {
   account: function($http) {
    return $http.get('http://example.com/account.json')
   }
  }
 })
});

推荐定义一个独立的service的方式来使用resolve key,并且使用service来相应返回所需的数据(这种方式更容易测试)。要这样处理的话,我们需要创建一个service:

首先,看一下accountService,

angular.module('app')
.factory('accountService', function($http, $q) {
 return {
  getAccount: function() {
   var d = $q.defer();
   $http.get('/account')
   .then(function(response) {
    d.resolve(response.data)
   }, function err(reason) {
    d.reject(reason);
   });
   return d.promise;
  }
 }
})

定义好service之后我们就可以使用这个service来替换上面代码中直接调用$http的方式了:

angular.module('myApp', ['ngRoute'])
.config(function($routeProvider) {
 $routeProvider
 .when('/account', {
  controller: 'AccountCtrl',
  templateUrl: 'views/account.html',
  resolve: {
   // We specify a promise to be resolved
   account: function(accountService) {
    return accountService.getAccount()
   }
  }
 })
});

以上所述是小编给大家介绍的AngularJS 防止页面闪烁的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
仿服务器端脚本方式的JS模板实现方法
Apr 27 Javascript
jQuery 点击图片跳转上一张或下一张功能的实现代码
Mar 12 Javascript
JavaScript Chart 插件整理
Jun 18 Javascript
jquery DIV撑大让滚动条滚到最底部代码
Jun 06 Javascript
jQuery实现连续动画效果实例分析
Oct 09 Javascript
BootStrap中的table实现数据填充与分页应用小结
May 26 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
Dec 07 Javascript
jQuery Validate 数组 全部验证问题
Jan 12 Javascript
微信小程序图片横向左右滑动案例
May 19 Javascript
详解react服务端渲染(同构)的方法
Sep 21 Javascript
vue使用axios跨域请求数据问题详解
Oct 18 Javascript
javascript实现的时间格式加8小时功能示例
Jun 13 Javascript
js读取json文件片段中的数据实例
Mar 09 #Javascript
JavaScript实现动态增删表格的方法
Mar 09 #Javascript
Angularjs处理页面闪烁的解决方法
Mar 09 #Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
Mar 09 #Javascript
jQuery实现字符串全部替换的方法【推荐】
Mar 09 #Javascript
js获取json中key所对应的value值的简单方法
Jun 17 #Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 #Javascript
You might like
用php过滤危险html代码的函数
2008/07/22 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
vue3中轻松实现switch功能组件的全过程
2021/01/07 Vue.js
Python比较两个图片相似度的方法
2015/03/13 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
django框架自定义用户表操作示例
2018/08/07 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
python画图常规设置方式
2020/03/05 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
python os模块在系统管理中的应用
2020/06/22 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
幼儿园毕业家长感言
2014/02/10 职场文书
年度安全生产目标责任书
2014/07/23 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
英语邀请函范文
2015/02/02 职场文书
Java实现简易的分词器功能
2021/06/15 Java/Android
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL