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 相关文章推荐
js获取数组的最后一个元素
Apr 14 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
May 31 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
Nov 02 Javascript
AngularJS封装$http.post()实例详解
May 06 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
Sep 19 Javascript
浅谈Postman解决token传参的问题
Mar 31 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
Jun 14 Javascript
js实现ATM机存取款功能
Oct 27 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
Jul 05 Javascript
laydate只显示时分 不显示秒的功能实现方法
Sep 28 Javascript
深入理解 TypeScript Reflect Metadata
Dec 12 Javascript
vue路由权限校验功能的实现代码
Jun 07 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
php生成验证码函数
2015/10/20 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
React 组件转 Vue 组件的命令写法
2018/02/28 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
Python中bisect的用法
2014/09/23 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
CSS3制作ajax loader icon实现思路及代码
2013/08/25 HTML / CSS
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
校园活动宣传方案
2014/03/28 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
新文化运动的口号
2014/06/21 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
南京大屠杀观后感
2015/06/02 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript