详解AngularJs路由之Ui-router-resolve(预加载)


Posted in Javascript onJune 13, 2017

ng-route模块中的when()和ui-route的state()都提供了resolve属性。

为什么需要使用resolve?

当路由切换的时候,被路由的页面中的元素(标签)就会立马显示出来,同时,数据会被准备好并呈现出来。但是注意,数据和元素并不是同步的,在没有任何设置的情况下,AngularJS默认先呈现出元素,而后再呈现出数据。这样就会导致页面会被渲染两遍,导致“页面UI抖动”的问题,对用户不太友好。resolve的出现解决了这个问题。

resolve是干嘛用的

resolve属性里的值会在路由成功前被预先设定好,然后注入到控制器中。通俗地将,就是等数据都“就位”后,才进行路由(其实我觉得也不能叫路由,因为路由是一些列的操作,其中就包括了设置resolve属性等等)。这样的好处就是页面仅会被渲染一遍。

<!--首页.html-->
<div ng-app="myApp">
<div><a ui-sref = "index">前往list.html</a></div>
<div ui-view></div><!--这里是路由视图存放的地方-->
</div>
<!--list.html>
<div>
  <h1>HI,这里是list.html</h1>
  <a ui-sref="index.list">点击加载list.html视图</a>
  <div ui-view></div>
  <h1>{{user}}</h1>
  <h2>{{name}}</h2>
  <h3>{{age}}</h3>
  <h3>{{email}}</h3>
</div>
//JS
var app = angular.module('myApp',['ui.router']);
app.config(["$stateProvider",function($stateProvider){
  $stateProvider
    .state("index",{
      url:'/',
      templateUrl:'list.html',
      controller:'myController',
      resolve:{
        user:function(){
          return {
            name:"perter",
            email:"826415551@qq.com",
            age:"18"
          }
        }
      }
    })
}]);
app.controller('myController',function($scope,user){
  $scope.name=user.name;
  $scope.age=user.age;
  $scope.email=user.email;
  $scope.user=user;
});

我在state方法里面设置了resolve属性,里面的值是一个名为user的对象,它存有几个值(格式好像JSON)。并把这个user变量注入到控制器中。这样就完成了预加载了。

这种把resolve属性的值(这里是user)注入到控制器的方式有一个非常强大的地方就是,可以运用他来重用控制器,而我们需要做的仅仅只是改变user对象里面的值(tips:如果是嵌套路由的话,不重新设置resolve值则会“继承”父路由的resolve值,如果不是嵌套路由且不重新设置,则不会正确显示)。

<!--list.html-->
<div>
  <h1>HI,这里是list.html</h1>
  <a ui-sref="index.list">点击加载list.html视图</a>
  <a ui-sref="index.list2">点击加载list2.html视图</a>
  <div ui-view></div>
  <h1>{{user}}</h1>
  <h2>{{name}}</h2>
  <h3>{{age}}</h3>
  <h3>{{email}}</h3>
</div>
//js
var app = angular.module('myApp',['ui.router']);
app.config(["$stateProvider",function($stateProvider){
  $stateProvider
    .state("index",{
      url:'/',
      templateUrl:'list.html',
      controller:'myController',
      resolve:{
        user:function(){
          return {
            name:"perter",
            email:"826415551@qq.com",
            age:"18"
          }
        }
      }
    })

    .state("index.list",{
      url:'/list',
      template:'<h1>{{name}}</h1>',
      controller:'myController',
    })
    .state("index.list2",{
      url:'/list2',
      template:'<h1>{{name}}</h1>',
      controller:'myController',
      resolve:{
        user:function () {
          return{
          name:"Rose"
          }
        }
      }
    })

}]);
app.controller('myController',function($scope,user){
  $scope.name=user.name;
  $scope.age=user.age;
  $scope.email=user.email;
  $scope.user=user;
});

这里省略了首页的html,可以翻到最上面看。重点对比最后的两个state(),可以发现第一个没有重新设置resolve属性,而第二个重新设置了resolve()属性。他们虽然共用了同一个控制器myController ,但是他们的值却不相同。

这样,控制器的可维护性就会得到提高。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
汉化英文版的Dreamweaver CS5并自动提示jquery
Nov 25 Javascript
js实现简单的星级选择器提交效果适用于评论等
Oct 18 Javascript
dreamweaver 8实现Jquery自动提示
Dec 04 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
Mar 27 Javascript
JavaScript实现自动变换表格边框颜色
May 08 Javascript
javascript实现随机显示星星特效
Jan 28 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
JS实现搜索框文字可删除功能
Dec 28 Javascript
ES6正则表达式的一些新功能总结
May 09 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
Jul 26 Javascript
解决小程序无法触发SESSION问题
Feb 03 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 #Javascript
深究AngularJS之ui-router详解
Jun 13 #Javascript
微信小程序自定义导航隐藏和显示功能
Jun 13 #Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
Jun 13 #Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
Jun 13 #Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
Jun 13 #Javascript
angularjs之$timeout指令详解
Jun 13 #Javascript
You might like
用PHP编程语言开发动态WAP页面
2006/10/09 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
php微信开发之关注事件
2018/06/14 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
老生常谈python之鸭子类和多态
2017/06/13 Python
python语音识别实践之百度语音API
2018/08/30 Python
QML使用Python的函数过程解析
2019/09/26 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
戴尔新西兰官网:Dell New Zealand
2020/01/07 全球购物
安全检查验收制度
2014/01/12 职场文书
大学生饮食连锁店创业计划书
2014/01/17 职场文书
学校安全检查制度
2014/01/27 职场文书
法制教育演讲稿
2014/09/10 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
宇宙与人观后感
2015/06/05 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
cypress测试本地web应用
2022/06/01 Javascript
mysql函数之截取字符串的实现
2022/08/14 MySQL