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 相关文章推荐
jQuery.Validate验证库的使用介绍
Apr 26 Javascript
在javascript中实现函数数组的方法
Dec 25 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
jquery插件锦集【推荐】
Dec 16 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
Dec 27 Javascript
前端构建工具之gulp的语法教程
Jun 12 Javascript
vuejs手把手教你写一个完整的购物车实例代码
Jul 06 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
Oct 26 Javascript
vue select选择框数据变化监听方法
Aug 24 Javascript
js实现图片3D轮播效果
Sep 21 Javascript
JS中的继承操作实例总结
Jun 06 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 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 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
laravel入门知识点整理
2020/09/15 PHP
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
js实现蒙版效果
2020/01/11 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
Python with语句用法原理详解
2020/07/03 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
园长自我鉴定
2013/10/06 职场文书
青年创业培训欢迎词
2014/01/08 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
工会积极分子个人总结
2015/03/03 职场文书
python​格式化字符串
2022/04/20 Python
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js