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 相关文章推荐
Jquery 点击按钮显示和隐藏层的代码
Jul 25 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
Dec 25 Javascript
jQuery操作select下拉框的text值和value值的方法
May 31 Javascript
window.open()实现post传递参数
Mar 12 Javascript
Fullpage.js固定导航栏-实现定位导航栏
Mar 17 Javascript
Bootstrap模态框禁用空白处点击关闭
Oct 20 Javascript
js实现导航吸顶效果
Feb 24 Javascript
原生JS实现自定义滚动条效果
Oct 27 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
Aug 11 Javascript
layui表格数据复选框回显设置方法
Sep 13 Javascript
ES6之Proxy的get方法详解
Oct 11 Javascript
全面解析JavaScript Module模式
Jul 24 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.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
[02:27]刀塔重生降临
2015/10/14 DOTA
让python在hadoop上跑起来
2016/01/27 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
python如何爬取个性签名
2018/06/19 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
Python用SSH连接到网络设备
2021/02/18 Python
广州一家公司的.NET面试题
2016/06/11 面试题
2014年组织部工作总结
2014/11/14 职场文书
课外活动总结
2015/02/04 职场文书
新学期家长寄语2016
2015/12/03 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB
改造DE1103三步曲
2022/04/07 无线电
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS