详解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 相关文章推荐
jquery1.83 之前所有与异步列队相关的模块详细介绍
Nov 13 Javascript
node.js中的path.normalize方法使用说明
Dec 08 Javascript
jQuery封装的tab选项卡插件分享
Jun 16 Javascript
jQuery实现类似标签风格的导航菜单效果代码
Aug 25 Javascript
ANGULARJS中使用JQUERY分页控件
Sep 16 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
Dec 08 Javascript
JavaScript动态检验密码强度的实现方法
Nov 09 Javascript
vue中axios解决跨域问题和拦截器的使用方法
Mar 07 Javascript
JQueryDOM之样式操作
Mar 27 jQuery
layui字体图标 loading图标静止不旋转的解决方法
Sep 23 Javascript
JavaScript实现省市联动效果
Nov 22 Javascript
vue-cli4.x创建企业级项目的方法步骤
Jun 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
Zend公司全球首推PHP认证
2006/10/09 PHP
substr()函数中文版
2006/10/09 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
python判断字符串是否纯数字的方法
2014/11/19 Python
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
Python中线程编程之threading模块的使用详解
2015/06/23 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
python 统计代码行数简单实例
2017/05/04 Python
彻底搞懂Python字符编码
2018/01/23 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
pyqt5 使用label控件实时显示时间的实例
2019/06/14 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
专升本个人自我评价
2013/12/22 职场文书
商务考察邀请函范文
2014/01/21 职场文书
入党自我评价优缺点
2014/01/25 职场文书
文秘人员工作职责
2014/01/31 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
计算机毕业生求职信
2014/06/10 职场文书
检举信的写法
2019/04/10 职场文书