详解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 相关文章推荐
javascript web页面刷新的方法收集
Jul 02 Javascript
jquery 弹出登录窗口实现代码
Dec 24 Javascript
javascript之通用简单的table选项卡实现(二)
May 09 Javascript
jQuery导航条固定定位效果实例代码
May 26 jQuery
Vue.js实现一个todo-list的上移下移删除功能
Jun 26 Javascript
vue与bootstrap实现时间选择器的示例代码
Aug 26 Javascript
vue2.0 实现导航守卫(路由守卫)
May 21 Javascript
vue.js指令v-for使用以及下标索引的获取
Jan 31 Javascript
Weex开发之地图篇的具体使用
Oct 16 Javascript
jQuery cookie的公共方法封装和使用示例
Jun 01 jQuery
vue中watch和computed的区别与使用方法
Aug 23 Javascript
ztree+ajax实现文件树下载功能
May 18 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+iframe图片上传实现即时刷新效果
2016/11/18 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
python 装饰器重要在哪
2021/02/14 Python
巴西女装购物网站:Eclectic
2018/04/24 全球购物
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
小学生自我评价范文
2014/01/25 职场文书
自主招生自荐信指南
2014/02/04 职场文书
投资合作协议书范本
2014/04/17 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技