详解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 相关文章推荐
用Mootools获得操作索引的两种方法分享
Dec 12 Javascript
原生js的弹出层且其内的窗口居中
May 14 Javascript
一个不错的字符串转码解码函数(自写)
Jul 31 Javascript
js仿黑客帝国字母掉落效果代码分享
Nov 08 Javascript
javascript事件绑定学习要点
Mar 09 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
BootStrap的table表头固定tbody滚动的实例代码
Aug 24 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
May 03 Javascript
js数字滑动时钟的简单实现(示例讲解)
Aug 14 Javascript
JavaScript递归算法生成树形菜单
Aug 15 Javascript
Vuepress 搭建带评论功能的静态博客的实现
Feb 17 Javascript
JavaScript的一些小技巧分享
Jan 06 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
2.PHP入门
2006/10/09 PHP
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
购物车实现的几种方式优缺点对比
2018/05/02 PHP
js版本A*寻路算法
2006/12/22 Javascript
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
jquery复选框全选/取消示例
2013/12/30 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
Three.js基础部分学习
2017/01/08 Javascript
Bootstrap列表组学习使用
2017/02/09 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
总结js函数相关知识点
2018/02/27 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
JS实现多选框的操作
2020/06/24 Javascript
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
python字典get()方法用法分析
2015/04/17 Python
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
常用的10个Python实用小技巧
2020/08/10 Python
Python页面加载的等待方式总结
2021/02/28 Python
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
在职人员函授期间自我评价分享
2013/11/08 职场文书
施工资料员的岗位职责
2013/12/22 职场文书
11月红领巾广播稿
2014/01/17 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
应届毕业生自荐信
2015/03/04 职场文书
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android