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 相关文章推荐
你需要知道的JavsScript可以做什么?
Jun 29 Javascript
js实现的网页颜色代码表全集
Jul 17 Javascript
Document对象内容集合(比较全)
Sep 06 Javascript
判断客户浏览器是否支持cookie的示例代码
Dec 23 Javascript
理解Javascript的call、apply
Dec 16 Javascript
JS实现仿PS的调色板效果完整实例
Dec 21 Javascript
Bootstrap响应式表格详解
May 23 Javascript
基于bootstrap写的一点localStorage本地储存
Nov 21 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
Mar 06 Javascript
原生js实现拖拽功能基本思路详解
Apr 18 Javascript
关于vue里页面的缓存详解
Nov 04 Javascript
vue组件系列之TagsInput详解
May 14 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
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
php单件模式结合命令链模式使用说明
2008/09/07 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
javascript实现随机抽奖功能
2020/12/30 Javascript
python生成器表达式和列表解析
2016/03/10 Python
python如何定义带参数的装饰器
2018/03/20 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
python求质数的3种方法
2018/09/28 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
Python 处理文件的几种方式
2019/08/23 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
特步官方商城:Xtep
2017/03/21 全球购物
先进个人获奖感言
2014/01/24 职场文书
建筑学专业自荐书
2014/07/09 职场文书
企业趣味活动方案
2014/08/21 职场文书
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js
python turtle绘图
2022/05/04 Python
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server