详解AngularJS 路由 resolve用法


Posted in Javascript onApril 24, 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 ,但是他们的值却不相同。
这样,控制器的可维护性就会得到提高。

除此之外还可以借助$ocLazyLoad动态加载js、css,用法如下:

resolve: { 
        deps: ['$ocLazyLoad', function($ocLazyLoad) { 
          return $ocLazyLoad.load({ 
            name: 'App', 
            insertBefore: '#ng_load_plugins_before',  
            files: [ 
              'xx/js/controllers/xx.js' 
            ] 
          }); 
        }], 
        showImgFiles: ['$ocLazyLoad', function($ocLazyLoad) { 
          return $ocLazyLoad.load([{ 
            name: 'App', 
            insertBefore: '#ng_load_plugins_before',  
            files: [ 
              'xx/xx/xx.css', 
              'xx/xx/xx.js' 
            ] 
          }]).then(function(){ 
            //做些事情 
          }); 
        }] 
      }

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

Javascript 相关文章推荐
js Flash插入函数免激活代码
Mar 31 Javascript
使用delegate方法为一个tr标签加一个链接
Jun 27 Javascript
jquery Validation表单验证使用详解
Sep 12 Javascript
jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
Sep 19 Javascript
Bootstrap页面缩小变形的快速解决办法
Feb 03 Javascript
JS简单实现数组去重的方法示例
Mar 27 Javascript
javascript回调函数的概念理解与用法分析
May 27 Javascript
layui自己添加图片按钮并点击跳转页面的例子
Sep 14 Javascript
layer 关闭指定弹出层的例子
Sep 25 Javascript
对Layer弹窗使用及返回数据接收的实例详解
Sep 26 Javascript
vue中使用GraphQL的实例代码
Nov 04 Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 Javascript
详解AngularJS ui-sref的简单使用
Apr 24 #Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
Apr 24 #Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
Apr 24 #Javascript
angular中实现控制器之间传递参数的方式
Apr 24 #Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
Apr 24 #Javascript
JS实现加载和读取XML文件的方法详解
Apr 24 #Javascript
JS简单获取日期相差天数的方法
Apr 24 #Javascript
You might like
PHP性能分析工具XHProf安装使用教程
2015/05/13 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
$.ajax json数据传递方法
2008/11/19 Javascript
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
详解Python的Django框架中的中间件
2015/07/24 Python
Python中dict和set的用法讲解
2019/03/28 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
大学活动邀请函
2014/01/28 职场文书
家长对老师的评语
2014/04/18 职场文书
个人担保书格式范文
2014/05/12 职场文书
表彰大会策划方案
2014/05/13 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
民政局个人整改措施
2014/09/24 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
单位政审意见范文
2015/06/04 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS