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 相关文章推荐
JS 实现图片直接下载示例代码
Jul 22 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
js右下角弹出提示框示例代码
Jan 12 Javascript
AngularJS页面传参的5种方式
Apr 01 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
Jan 17 Javascript
vue中使用cropperjs的方法
Mar 01 Javascript
使用Angular CLI从蓝本生成代码详解
Mar 24 Javascript
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
vue2.0 下拉框默认标题设置方法
Aug 22 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
Mar 07 jQuery
详解微信小程序之一键复制到剪切板
Apr 24 Javascript
JavaScript定时器设置、使用与倒计时案例详解
Jul 08 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
JavaScript修改css样式style
2008/04/15 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
2020/03/09 Python
keras多显卡训练方式
2020/06/10 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
年终晚会主持词
2014/03/25 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
2014教师年度工作总结
2014/11/10 职场文书
杨善洲观后感
2015/06/04 职场文书
遗愿清单观后感
2015/06/09 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
用JS实现飞机大战小游戏
2021/06/09 Javascript