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 相关文章推荐
实现web打印的各种方法介绍及实现代码
Jan 09 Javascript
基于jquery实现的省市区级联无ajax
Sep 24 Javascript
手机号码,密码正则验证
Sep 04 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
Aug 06 Javascript
学习JavaScript设计模式(封装)
Nov 26 Javascript
jQuery EasyUi实战教程之布局篇
Jan 26 Javascript
使用three.js 画渐变的直线
Jun 05 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
JavaScript与Java正则表达式写法的区别介绍
Aug 15 Javascript
vue axios同步请求解决方案
Sep 29 Javascript
Vue props用法详解(小结)
Jul 03 Javascript
javascript实现手动点赞效果
Apr 09 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
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
vue.js中npm安装教程图解
2018/04/10 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
Jquery的Ajax技术使用方法
2019/01/21 jQuery
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python类的继承和多态代码详解
2017/12/27 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
Python实现最常见加密方式详解
2019/07/13 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
团日活动策划书
2014/02/01 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
Python如何把不同类型数据的json序列化
2021/04/30 Python