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 相关文章推荐
js模拟实现Array的sort方法
Dec 11 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
May 24 Javascript
JS获取整个页面文档的实现代码
Dec 15 Javascript
浅谈javascript六种数据类型以及特殊注意点
Dec 20 Javascript
javascript(js)的小数点乘法除法问题详解
Mar 07 Javascript
Windows 系统下安装和部署Egret的开发环境
Jul 31 Javascript
Javascript获取图片原始宽度和高度的方法详解
Sep 20 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
Sep 29 Javascript
Web 开发中Ajax的Session 超时处理方法
Jan 19 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
微信小程序简单的canvas裁剪图片功能详解
Jul 12 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
Oct 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全局变量和类配合使用深刻理解
2013/06/05 PHP
php验证session无效的解决方法
2014/11/04 PHP
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
Jquery遍历checkbox获取选中项value值的方法
2014/02/13 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
javascript中this的用法实践分析
2019/07/29 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
Python列表list排列组合操作示例
2018/12/18 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
省三好学生申请材料
2014/01/22 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
班子四风对照检查材料
2014/08/21 职场文书
超级礼物观后感
2015/06/15 职场文书
银行培训心得体会范文
2016/01/09 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
vue自定义右键菜单之全局实现
2022/04/09 Vue.js