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 相关文章推荐
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
JavaScript 高效运行代码分析
Mar 18 Javascript
某页码显示的helper 少量调整,另附js版
Sep 12 Javascript
JSP跨iframe如何传递参数实现代码
Sep 21 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
Bootstrap源码解读模态弹出框(11)
Dec 28 Javascript
js Canvas绘制圆形时钟效果
Feb 17 Javascript
angular仿支付宝密码框输入效果
Mar 25 Javascript
AngularJS中下拉框的基本用法示例
Oct 11 Javascript
js中的this的指向问题详解
Aug 29 Javascript
聊聊Vue中provide/inject的应用详解
Nov 10 Javascript
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
Apr 13 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
PHP数组操作类实例
2015/07/11 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
js中if语句的几种优化代码写法
2011/03/12 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
Vue.js父与子组件之间传参示例
2017/02/28 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
vue2.0 实现页面导航提示引导的方法
2018/03/13 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
Python实现的简单读写csv文件操作示例
2018/07/12 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
python实现贪吃蛇游戏
2020/03/21 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python opencv摄像头的简单应用
2019/06/06 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
毕业生文员求职信
2013/11/03 职场文书
会计电算化专业个人的自我评价
2013/11/24 职场文书
理工科学生的自我评价
2013/12/15 职场文书
学生会招新策划书
2014/02/14 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
《金子》教学反思
2014/04/13 职场文书
大专学生求职信
2014/07/04 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
学校远程教育工作总结
2015/08/11 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书