Angularjs处理页面闪烁的解决方法


Posted in Javascript onMarch 09, 2017

摘要

在使用{{}}绑定数据的时候,页面加载会出现满屏尽是{{xxx}}的情况。数据还没响应,但页面已经渲染了。这是因为浏览器和angularjs渲染页面都需要消耗一定的时间,这个间隔可能很小,甚至让人感觉不到,这种情况一切正常,但这个时间也可能很长,这时候用户可能会看到满屏尽是{{xxxx}}。这种情况被叫做“Flash Of Unrendered Content (FOUC)(K)?and is always unwanted.”。

问题

为了图方便,我们很喜欢使用下面的做法

<div>
  {{name}}
 </div>

但这也为满屏尽是{{}}埋下了坑。当接口,网络响应速度够快的情况下,很难发现这个问题,但放在移动端4g或者网络环境更差的情况下,这个问题就会频发。

解决办法

1、ng-cloak

该指令是angularjs的内置的指令,它的作用是隐藏所有被它包含的元素。在浏览器加载和编译渲染完成后,angularjs会自动删除ngCloak元素属性,这样这个元素就会变为可见的。

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

2、ng-bind

该指令是angularjs内置的用于绑定页面数据的指令。可以使用该指令代替{{}}的方式绑定数据到页面上。使用ng-bind可以防止未被渲染的{{}}展示给用户。如下所示:

<div ng-bind="name">  
 </div>

3、resolve

当使用routes路由的时候,resolve可以防止我们在route路由被完全加载之前获取我们需要加载的数据,当数据被加载成功之后,路由再改变而页面也会呈现给用户,数据没有加载成功route不会改变。

可以参考

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可以作为可注入的依赖:

ngular.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的方式了:

ngular.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()
  }
 }
 })
Javascript 相关文章推荐
Display SQL Server Login Mode
Jun 21 Javascript
用javascript来实现动画导航效果的代码
Dec 16 Javascript
基于Jquery制作的幻灯片图集效果打包下载
Feb 12 Javascript
使用js如何实现全选与全不选
Dec 30 Javascript
JS中判断JSON数据是否存在某字段的方法
Mar 07 Javascript
javascript日期验证之输入日期大于等于当前日期
Dec 13 Javascript
ionic实现滑动的三种方式
Aug 27 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 Javascript
Vue 短信验证码组件开发详解
Feb 14 Javascript
jquery easyui如何实现格式化列
Jul 30 jQuery
Vue组件中slot的用法
Jan 30 Javascript
详解Javascript中new()到底做了些什么?
Mar 29 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
Mar 09 #Javascript
jQuery实现字符串全部替换的方法【推荐】
Mar 09 #Javascript
js获取json中key所对应的value值的简单方法
Jun 17 #Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 #Javascript
Angular.js中处理页面闪烁的方法详解
Mar 09 #Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
Mar 09 #Javascript
JS实现课堂随机点名和顺序点名
Mar 09 #Javascript
You might like
php explode函数实例代码
2012/02/27 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
2010年最佳jQuery插件整理
2010/12/06 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
Python正则表达式知识汇总
2017/09/22 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
html2 canvas生成清晰的图片实现打印功能
2019/09/23 HTML / CSS
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
建筑公司员工自我鉴定
2014/04/08 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python
详细了解MVC+proxy
2021/07/09 Java/Android
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers