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 相关文章推荐
Extjs ajax同步请求时post方式参数发送方式
Aug 05 Javascript
js中传递特殊字符(+,&amp;)的方法
Jan 16 Javascript
用JQuery实现全选与取消的两种简单方法
Feb 22 Javascript
jQuery实现文本框邮箱输入自动补全效果
Nov 17 Javascript
jQuery插件dataTables添加序号列的方法
Jul 06 Javascript
关于数据与后端进行交流匹配(点亮星星)
Aug 03 Javascript
基于JavaScript实现轮播图原理及示例
Apr 10 Javascript
React + webpack 环境配置的方法步骤
Sep 07 Javascript
js循环map 获取所有的key和value的实现代码(json)
May 09 Javascript
解决layui table表单提示数据接口请求异常的问题
Sep 24 Javascript
Vue中点击active并第一个默认选中功能的实现
Feb 24 Javascript
24个ES6方法解决JS实际开发问题(小结)
May 31 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小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
Javascript之深入浅出prototype
2017/02/06 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
jquery获取transform里的值实现方法
2017/12/12 jQuery
react-native封装插件swiper的使用方法
2018/03/20 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
Python 字符串大小写转换的简单实例
2017/01/21 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
思想汇报范文
2013/11/04 职场文书
分居协议书范本
2014/11/03 职场文书
农村党员干部承诺书
2015/05/04 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
幼儿园见习总结
2015/06/23 职场文书
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python