详解AngularJs路由之Ui-router-resolve(预加载)


Posted in Javascript onJune 13, 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 ,但是他们的值却不相同。

这样,控制器的可维护性就会得到提高。

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

Javascript 相关文章推荐
jquery 3D球状导航的文章分类
Jul 06 Javascript
js实现目录定位正文示例
Nov 14 Javascript
js 高效去除数组重复元素示例代码
Dec 19 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
Aug 20 Javascript
js判断移动端是否安装某款app的多种方法
Dec 18 Javascript
JavaScript字符串常用的方法
Mar 10 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
Mar 13 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
Sep 13 Javascript
AngularJs ng-change事件/指令的用法小结
Nov 01 Javascript
vue项目国际化vue-i18n的安装使用教程
Mar 14 Javascript
微信小程序音乐播放器开发
Nov 20 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 #Javascript
深究AngularJS之ui-router详解
Jun 13 #Javascript
微信小程序自定义导航隐藏和显示功能
Jun 13 #Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
Jun 13 #Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
Jun 13 #Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
Jun 13 #Javascript
angularjs之$timeout指令详解
Jun 13 #Javascript
You might like
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
DOM精简教程
2006/10/03 Javascript
List Installed Hot Fixes
2007/06/12 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
js函数的延迟加载实现代码
2012/10/11 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
浅谈Node.js之异步流控制
2017/10/25 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
使用Python解析JSON数据的基本方法
2015/10/15 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
Python实现ping指定IP的示例
2018/06/04 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
12月红领巾广播稿
2014/02/13 职场文书
《老王》教学反思
2014/02/23 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
企业管理标语
2014/06/10 职场文书
体育口号大全
2014/06/18 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
幼儿园见习总结
2015/06/23 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
javascript Number 与 Math对象的介绍
2021/11/17 Javascript
python通过新建环境安装tfx的问题
2022/05/20 Python