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 相关文章推荐
javascript使用eval或者new Function进行语法检查
Oct 16 Javascript
javascript开发技术大全 第4章 直接量与字符集
Jul 03 Javascript
通过jQuery源码学习javascript(三)
Dec 27 Javascript
获取3个数组不重复的值的具体实现
Dec 30 Javascript
js数字转换为float,取N位小数
Feb 08 Javascript
JS高级技巧(简洁版)
Jul 29 Javascript
element ui 表格动态列显示空白bug 修复方法
Sep 04 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
Sep 06 Javascript
js实现掷骰子小游戏
Oct 24 Javascript
Node.js API详解之 net模块实例分析
May 18 Javascript
vue-router 2.0 跳转之router.push()用法说明
Aug 12 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
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
php发送邮件的问题详解
2015/06/22 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
Python中给List添加元素的4种方法分享
2014/11/28 Python
在类Unix系统上开始Python3编程入门
2015/08/20 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
Linux管理员面试题 Linux admin interview questions
2014/11/01 面试题
旷课检讨书500字
2014/10/14 职场文书
2014年前台文员工作总结
2014/12/08 职场文书
检讨书格式
2015/01/23 职场文书
高三英语教学反思
2016/03/03 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js