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 相关文章推荐
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
jQuery 常见开发使用技巧总结
Dec 26 Javascript
javascript 二分法(数组array)
Apr 24 Javascript
javascript获取鼠标点击元素对象(示例代码)
Dec 20 Javascript
Bootstrap每天必学之栅格系统(布局)
Nov 25 Javascript
Sea.JS知识总结
May 05 Javascript
JavaScript中对JSON对象的基本操作示例
May 21 Javascript
JavaScript禁止微信浏览器下拉回弹效果
May 16 Javascript
vue element 生成无线级左侧菜单的实现代码
Aug 21 Javascript
vue实现简单瀑布流布局
May 28 Javascript
vue2.x数组劫持原理的实现
Apr 19 Javascript
javascript中call,apply,bind的区别详解
Dec 11 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下检测字符串是否是utf8编码的代码
2008/06/28 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
angularjs基础教程
2014/12/25 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
JavaScript的jQuery库中function的存在和参数问题
2015/08/13 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
Vue header组件开发详解
2018/01/26 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
Python爬取成语接龙类网站
2018/10/19 Python
python3 反射的四种基本方法解析
2019/08/26 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
django项目中新增app的2种实现方法
2020/04/01 Python
使用Python pip怎么升级pip
2020/08/11 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
年终自我鉴定
2013/10/09 职场文书
秋季运动会活动方案
2014/02/05 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
银行贷款委托书范本
2014/10/11 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
学雷锋活动简报
2015/07/20 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
宪法宣传标语100条
2019/10/15 职场文书