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脚本
Dec 12 Javascript
jQuery EasyUI API 中文文档 - Parser 解析器
Sep 29 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
JS实现超精简响应鼠标显示二级菜单代码
Sep 12 Javascript
Angular.JS中的this指向详解
May 17 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
Vue 项目中遇到的跨域问题及解决方法(后台php)
Mar 28 Javascript
js将键值对字符串转为json字符串的方法
Mar 30 Javascript
JavaScript实现抖音罗盘时钟
Oct 11 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
Dec 19 Javascript
jQuery AJAX应用实例总结
May 19 jQuery
JavaScript eval()函数定义及使用方法详解
Jul 07 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
教你如何把一篇文章按要求分段
2006/10/09 PHP
php构造函数实例讲解
2013/11/13 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
canvas绘制七巧板
2017/02/03 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
幼儿园安全检查制度
2014/01/30 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
小班上学期个人总结
2015/02/12 职场文书
小学六年级毕业感言
2015/07/30 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电
详解PyTorch模型保存与加载
2022/04/28 Python