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 页面 Mask实现代码
Jan 09 Javascript
js异步加载的三种解决方案
Mar 04 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
Mar 27 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
Jun 27 Javascript
常见表单重复提交问题整理及解决方法
Nov 13 Javascript
子页向父页传值示例
Nov 27 Javascript
jQuery学习笔记之总体架构
Jun 03 Javascript
一个JavaScript函数把URL参数解析成Json对象
Sep 24 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
Mar 01 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
Nov 24 Javascript
JavaScript中的一些实用小技巧总结
Apr 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
电脑硬件及电脑配置知识大全
2020/03/17 数码科技
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
php中实现简单的ACL 完结篇
2011/09/07 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
2021/03/09 Servers
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
python实现html转ubb代码(html2ubb)
2014/07/03 Python
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
python批量修改文件名的示例
2020/09/27 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
时尚休闲吧创业计划书
2014/01/25 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
走进科学观后感
2015/06/18 职场文书
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android