详解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 相关文章推荐
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
Sep 27 Javascript
javascript中attachEvent用法实例分析
May 14 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
Mar 05 Javascript
常用Javascript函数与原型功能收藏(必看篇)
Oct 09 Javascript
BootStrap3使用错误记录及解决办法
Dec 22 Javascript
微信小程序 动态绑定数据及动态事件处理
Mar 14 Javascript
node.js+jQuery实现用户登录注册AJAX交互
Apr 28 jQuery
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
Jul 24 Javascript
浅谈React Native 中组件的生命周期
Sep 08 Javascript
JS实现的邮箱提示补全效果示例
Jan 30 Javascript
前后端常见的几种鉴权方式(小结)
Aug 04 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
Nov 06 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
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
详解Angular2组件之间如何通信
2017/06/22 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python批量转换文件编码格式
2015/05/17 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
Python接口测试文件上传实例解析
2020/05/22 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
个人简历自我评价八例
2013/10/31 职场文书
建筑工程专业学生的自我评价
2013/12/25 职场文书
益达广告词
2014/03/14 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server