Angularjs处理页面闪烁的解决方法


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不会改变。

可以参考

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权威指南 学习笔记之javascript数据类型
Sep 24 Javascript
javascript设计模式之对象工厂函数与构造函数详解
Jul 30 Javascript
基于js实现投票的实例代码
Aug 04 Javascript
jQuery Validate初步体验(一)
Dec 12 Javascript
第三篇Bootstrap网格基础
Jun 21 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
基于JS设计12306登录页面
Dec 28 Javascript
微信小程序左右滑动切换页面详解及实例代码
Feb 28 Javascript
vue  directive定义全局和局部指令及指令简写
Nov 20 Javascript
详解用场景去理解函数柯里化(入门篇)
Apr 11 Javascript
JavaScript冒泡算法原理与实现方法深入理解
Jun 04 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
Mar 02 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
Mar 09 #Javascript
jQuery实现字符串全部替换的方法【推荐】
Mar 09 #Javascript
js获取json中key所对应的value值的简单方法
Jun 17 #Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 #Javascript
Angular.js中处理页面闪烁的方法详解
Mar 09 #Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
Mar 09 #Javascript
JS实现课堂随机点名和顺序点名
Mar 09 #Javascript
You might like
建立文件交换功能的脚本(三)
2006/10/09 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
详细讲解JS节点知识
2010/01/31 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
JS获取时间的方法
2015/01/21 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
Python数据库小程序源代码
2019/09/15 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
python关于倒排列的知识点总结
2020/10/13 Python
使用python实现学生信息管理系统
2021/02/25 Python
Java软件工程师综合面试题笔试题
2013/09/08 面试题
大学生2014全国两会学习心得体会
2014/03/10 职场文书
如何写自我鉴定
2014/03/19 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
蓬莱阁导游词
2015/02/04 职场文书
客户付款通知书
2015/04/23 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js