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 相关文章推荐
使用正则替换变量
May 05 Javascript
javascript 操作select下拉列表框的一点小经验
Mar 20 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
Nov 28 Javascript
javascript关于继承的用法汇总
Dec 20 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
Aug 26 Javascript
基于Three.js插件制作360度全景图
Nov 29 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
Apr 06 Javascript
js登录滑动验证的实现(不滑动无法登陆)
Jan 03 Javascript
详解vue 单页应用(spa)前端路由实现原理
Apr 04 Javascript
uni app仿微信顶部导航条功能
Sep 17 Javascript
vuex实现数据状态持久化
Nov 11 Javascript
微信小程序仿通讯录功能
Apr 09 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的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
PHP 实现缩略图
2021/03/09 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
Python中模块string.py详解
2017/03/12 Python
Python中一般处理中文的几种方法
2019/03/06 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
学校安全工作制度
2014/01/19 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
运动会口号大全
2014/06/07 职场文书
单位委托书怎么写
2014/09/21 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
出国留学导师推荐信
2015/03/26 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
导游词之阆中古城
2019/12/23 职场文书