详解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检测页面是否缩放的小例子
May 16 Javascript
JavaScript阻止事件冒泡示例分享
Dec 28 Javascript
js中键盘事件实例简析
Jan 10 Javascript
jquery实现图片水平滚动效果代码分享
Aug 26 Javascript
实践中学习AngularJS表单
Mar 21 Javascript
AngularJS Bootstrap详细介绍及实例代码
Jul 28 Javascript
ES6实现的遍历目录函数示例
Apr 07 Javascript
实例解析Vue.js下载方式及基本概念
May 11 Javascript
Vue中用props给data赋初始值遇到的问题解决
Nov 27 Javascript
vue 动态表单开发方法案例详解
Dec 02 Javascript
Vuejs中的watch实例详解(监听者)
Jan 05 Javascript
javascript canvas实现雨滴效果
Jun 09 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
风格模板初级不完全修改教程
2006/10/09 PHP
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
PHP+DBM的同学录程序(1)
2006/10/09 PHP
PHP生成静态页面详解
2006/11/19 PHP
解析argc argv在php中的应用
2013/06/24 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
浅谈Vue.js
2017/03/02 Javascript
删除table表格行的实例讲解
2017/09/21 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
python pygame实现2048游戏
2018/11/20 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
24个canvas基础知识小结
2014/12/17 HTML / CSS
运动会运动员赞词
2015/07/22 职场文书
新娘婚礼致辞
2015/07/27 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
Windows下载并安装MySQL8.0.x 版本的完整教程
2022/04/10 MySQL