详解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 相关文章推荐
jQuery图片滚动图片的效果(另类实现)
Jun 02 Javascript
js面向对象编程之如何实现方法重载
Jul 02 Javascript
14个有用的Jquery技巧分享
Jan 08 Javascript
jQuery使用之处理页面元素用法实例
Jan 19 Javascript
jQuery简单实现验证邮箱格式
Jul 15 Javascript
第十章之巨幕页头缩略图与警告框组件
Apr 25 Javascript
深入理解ECMAScript的几个关键语句
Jun 01 Javascript
解决VUEX刷新的时候出现数据消失
Jul 03 Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
Feb 11 Javascript
vant时间控件使用方法详解
Dec 24 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中获取文件扩展名的N种方法小结
2012/02/27 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
[03:27]最受玩家喜爱奖提名:PZH_Element 致玩家寄语
2016/12/20 DOTA
python条件和循环的使用方法
2013/11/01 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
Python turtle画图库&amp;&amp;画姓名实例
2020/01/19 Python
Python如何访问字符串中的值
2020/02/09 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
python os模块常用的29种方法使用详解
2020/06/02 Python
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
财务管理职业生涯规划书
2014/02/26 职场文书
住宅质量保证书
2014/04/29 职场文书
市场营销战略计划书
2014/05/06 职场文书
应届本科毕业生求职信
2014/07/23 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
餐饮店长岗位职责
2015/04/14 职场文书