AngularJS 防止页面闪烁的方法


Posted in Javascript onMarch 09, 2017

我们知道在应用的页面或者组件需要加载数据时,浏览器和angular渲染页面都需要消耗一定的时间。这里的间隔可能很小,甚至让人感觉不到区别;但也可能很长,这样会导致让我们的用户看到了没有被渲染过的页面。

这种情况被叫做Flash Of Unrendered Content (FOUC)(K)?and is always unwanted.下面我们将要介绍几个不同的方式防止这种情况发生在我们的用户身上。

1、ng-cloak

ng-cloak指令是angular的内置指令,它的作用是隐藏所有被它包含的元素:

<div ng-cloak>
 <h1>Hello {{ name }}</h1>
</div>

在浏览器加载和编译渲染完成之后,angular会自动删除ngCloak元素属性,这样这个元素就会变成可见的。

在IE7里面使用ng-cloak的安全方式是给元素多加一个ng-cloak class

<div ng-cloak class="ng-cloak">
 <h1>Hello {{ name }}</h1>
</div>

2、ng-bind

ng-bind是angular里面另一个内置的用于操作绑定页面数据的指令。我们可以使用ng-bind代替{{ }}的形式绑定元素到页面上;

使用ng-bind替代{{  }}可以防止未被渲染的{{ }}就展示给用户了,使用ng-bind渲染的空元素替代{{ }}会显得友好很多。

上面的例子可以重写成下面那样,这样就可以防止页面出现{{ }}了

<div>
 <h1>Hello <span ng-bind="name"></span></h1>
</div>

3、resolve

当在不同的页面之间使用routes(路由)的时候,我们有另外的方式防止页面在数据被完全加载到route之前被渲染。

在route(路由)里使用resolve可以让我们在route(路由)被完全加载之前获取我们需要加载的数据。当数据被加载成功之后,路由就会改变而页面也会呈现给用户;数据没有被加载成功route就不会改变, the $routeChangeError event will get fired.【$routeChangeError事件就(不)会被激活?】

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可以作为可注入的依赖:

angular.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的方式了:

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(accountService) {
    return accountService.getAccount()
   }
  }
 })
});

以上所述是小编给大家介绍的AngularJS 防止页面闪烁的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
在Javascript中定义对象类别
Dec 22 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
Apr 16 Javascript
js 固定悬浮效果实现思路代码
Aug 02 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
Nov 08 Javascript
javascript闭包传参和事件的循环绑定示例探讨
Apr 17 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
Mar 13 Javascript
JavaScript中数据结构与算法(一):栈
Jun 19 Javascript
javascript如何实现360度全景照片问题汇总
Apr 04 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
Oct 19 Javascript
jQuery实现的简单拖动层示例
Feb 22 Javascript
js实现多张图片延迟加载效果
Jul 17 Javascript
cocos2dx+lua实现橡皮擦功能
Dec 20 Javascript
js读取json文件片段中的数据实例
Mar 09 #Javascript
JavaScript实现动态增删表格的方法
Mar 09 #Javascript
Angularjs处理页面闪烁的解决方法
Mar 09 #Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
Mar 09 #Javascript
jQuery实现字符串全部替换的方法【推荐】
Mar 09 #Javascript
js获取json中key所对应的value值的简单方法
Jun 17 #Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 #Javascript
You might like
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
node.js中的fs.chmodSync方法使用说明
2014/12/18 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
python中使用mysql数据库详细介绍
2015/03/27 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
软件测试面试题
2014/01/05 面试题
十八届三中全会感言
2014/03/10 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
优秀员工事迹材料
2014/12/20 职场文书
会计工作岗位职责
2015/02/03 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
2019同学聚会主持词
2019/05/06 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
Oracle 触发器trigger使用案例
2022/02/24 Oracle
spring boot实现文件上传
2022/08/14 Java/Android