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使用手册之一
Mar 24 Javascript
IE和Mozilla的兼容性汇总event
Aug 12 Javascript
JavaScript控制Session操作方法
Jan 17 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
Jan 13 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
Apr 16 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
Jun 07 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
Nov 24 Javascript
JS操作xml对象转换为Json对象示例
Mar 25 Javascript
prototype.js简单实现ajax功能示例
Oct 18 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
Dec 27 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
May 01 Javascript
微信小程序图片左右摆动效果详解
Jul 13 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
PHP中的表达式简述
2016/05/29 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
Python3 入门教程 简单但比较不错
2009/11/29 Python
Python中datetime常用时间处理方法
2015/06/15 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
python图片剪裁代码(图片按四个点坐标剪裁)
2020/03/10 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
python批量修改交换机密码的示例
2020/09/22 Python
Python 实现一个简单的web服务器
2021/01/03 Python
css sprite简单实例
2016/05/23 HTML / CSS
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
菜篮子工程实施方案
2014/03/08 职场文书
大学新生入学教育方案
2014/05/16 职场文书
咖啡店创业计划书
2014/08/15 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
工厂门卫岗位职责
2015/04/13 职场文书
2015国庆节宣传语
2015/07/14 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
Java中try catch处理异常示例
2021/12/06 Java/Android