Angular.js中处理页面闪烁的方法详解


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不会改变。

可以参考:https://3water.com/article/80523.htm

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 使用手册(一)
Sep 23 Javascript
javascript window.opener的用法分析
Apr 07 Javascript
jQuery实现可收缩展开的级联菜单实例代码
Nov 27 Javascript
jQuery实现3D文字特效的方法
Mar 10 Javascript
谈谈JavaScript类型系统之Math
Jan 06 Javascript
基于JavaScript实现回到页面顶部动画代码
May 24 Javascript
js的各种排序算法实现(总结)
Jul 23 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
Sep 27 Javascript
layui动态绑定事件的方法
Sep 20 Javascript
js实现图片粘贴到网页
Dec 06 Javascript
vue滑动吸顶及锚点定位的示例代码
May 10 Javascript
js前端面试常见浏览器缓存强缓存及协商缓存实例
Jun 21 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
Mar 09 #Javascript
JS实现课堂随机点名和顺序点名
Mar 09 #Javascript
JavaScript实现两个select下拉框选项左移右移
Mar 09 #Javascript
js实现年月日表单三级联动
Apr 17 #Javascript
js实现3D图片展示效果
Mar 09 #Javascript
JavaScript实现左右下拉框动态增删示例
Mar 09 #Javascript
less简单入门(CSS 预处理语言)
Mar 08 #Javascript
You might like
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
实例讲解php实现多线程
2019/01/27 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
Python max内置函数详细介绍
2016/11/17 Python
Python简单生成随机数的方法示例
2018/03/31 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
Django单元测试工具test client使用详解
2019/08/02 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
Python正则表达式如何匹配中文
2020/05/27 Python
Python descriptor(描述符)的实现
2020/11/15 Python
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
深圳-东方伟业笔试部分
2015/02/11 面试题
学生个人求职自荐信格式
2013/09/23 职场文书
婚礼主持词开场白
2014/03/13 职场文书
校园安全标语
2014/06/07 职场文书
文员求职信
2014/07/15 职场文书
学生会感恩节活动方案
2014/10/11 职场文书