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 相关文章推荐
图片完美缩放
Sep 07 Javascript
jquery命令汇总,方便使用jquery的朋友
Jun 26 Javascript
js 实现菜单左右滚动显示示例介绍
Nov 21 Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
Jun 11 Javascript
jquery实现的点击翻书效果代码
Nov 04 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
Nov 15 Javascript
学习JavaScript设计模式之中介者模式
Jan 14 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
Apr 29 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
Feb 26 Javascript
Angularjs修改密码的实例代码
May 26 Javascript
SSM VUE Axios详解
Oct 05 Vue.js
多个上传文件用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去除换行(回车换行)的三种方法
2014/03/26 PHP
PHP取余函数介绍MOD(x,y)与x%y
2014/05/15 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
好的Python培训机构应该具备哪些条件
2018/05/23 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
python实现二维插值的三维显示
2018/12/17 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
2020/07/14 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
中专毕业生自我鉴定范文
2013/11/09 职场文书
国窖1573广告词
2014/03/21 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
认购协议书范本
2014/04/22 职场文书
师范类求职信
2014/06/21 职场文书
赔偿协议书范本
2014/09/12 职场文书
共青团员自我评价范文
2014/09/14 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
php png失真的原因及解决办法
2021/11/17 PHP
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python