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 相关文章推荐
textarea的value是html文件源代码,存成html文件的代码
Apr 20 Javascript
javascript学习笔记--数字格式类型
May 22 Javascript
原生javaScript实现图片延时加载的方法
Dec 22 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
Aug 06 Javascript
JavaScript学习笔记之ES6数组方法
Mar 25 Javascript
jQuery编写网页版2048小游戏
Jan 06 Javascript
React Native实现地址挑选器功能
Oct 24 Javascript
Vue2 配置 Axios api 接口调用文件的方法
Nov 13 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
Dec 04 Javascript
JavaScript中创建原子的方法总结
Aug 26 Javascript
javascript 原型与原型链的理解及实例分析
Nov 23 Javascript
json.stringify()与json.parse()的区别以及用处
Jan 25 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
SONY ICF-F10中波修复记
2021/03/02 无线电
我常用的几个类
2006/10/09 PHP
PHP数字格式化
2006/12/06 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
Python  连接字符串(join %)
2008/09/06 Python
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
python 实现波浪滤镜特效
2020/12/02 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
传媒专业推荐信范文
2013/11/23 职场文书
社区食品安全实施方案
2014/03/28 职场文书
体育之星事迹材料
2014/05/11 职场文书
团代会邀请函
2015/02/02 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
义卖募捐活动总结
2015/05/09 职场文书
开学第一周值周总结
2015/07/16 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
Python序列化与反序列化相关知识总结
2021/06/08 Python
python机器学习实现oneR算法(以鸢尾data为例)
2022/03/03 Python