详解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 相关文章推荐
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
Apr 12 Javascript
用js查找法实现当前栏目的高亮显示的代码
Nov 24 Javascript
初试jQuery EasyUI 使用介绍
Apr 01 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
Dec 11 Javascript
JavaScript中对象介绍
Dec 31 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
jQuery实现ToolTip元素定位显示功能示例
Nov 23 Javascript
JavaScript中变量、指针和引用功能与操作示例
Aug 04 Javascript
vue实现多组关键词对应高亮显示功能
Jul 25 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
Apr 17 Javascript
jquery+css3实现的经典弹出层效果示例
May 16 jQuery
vue实现登录拦截
Jun 29 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使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
jquery动态加载图片数据练习代码
2011/08/04 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
jQuery中each方法的使用详解
2018/03/18 jQuery
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
python 七种邮件内容发送方法实例
2014/04/22 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
基于pandas中expand的作用详解
2019/12/17 Python
pandas 对group进行聚合的例子
2019/12/27 Python
从训练好的tensorflow模型中打印训练变量实例
2020/01/20 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
结构和类有什么异同
2012/07/16 面试题
一些Solaris面试题
2015/12/22 面试题
应征英语教师求职信
2013/11/27 职场文书
广播体操比赛口号
2014/06/10 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
大学生在校表现评语
2014/12/31 职场文书
工作失职检讨书
2015/01/26 职场文书
公司年夜饭通知
2015/04/25 职场文书
信仰观后感
2015/06/03 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
高中军训感想
2015/08/07 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书