详解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 相关文章推荐
JavaScript 设计模式学习 Singleton
Jul 27 Javascript
优化javascript的执行速度
Jan 23 Javascript
Jquery实现仿京东商城省市联动菜单
Nov 19 Javascript
三分钟带你玩转jQuery.noConflict()
Feb 15 Javascript
jQuery特殊符号转义的实现
Nov 30 Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 Javascript
基于jQuery实现数字滚动效果
Jan 16 Javascript
Vue父组件调用子组件事件方法
Feb 23 Javascript
antd Upload 文件上传的示例代码
Dec 14 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
May 05 Javascript
JS实现骰子3D旋转效果
Oct 24 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使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
Python算法之图的遍历
2017/11/16 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
Django model select的多种用法详解
2019/07/16 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
keras得到每层的系数方式
2020/06/15 Python
python opencv实现简易画图板
2020/08/27 Python
python/golang 删除链表中的元素
2020/09/14 Python
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
上海奥佳笔试题面试题
2016/11/16 面试题
快餐公司创业计划书
2014/04/29 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
小学国庆节活动总结
2015/03/23 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技