深究AngularJS之ui-router详解


Posted in Javascript onJune 13, 2017

1.配置使用ui-router

1.1导入js文件

需要注意的是:必须导入angular.min.js这个文件,且angular.min.js必须导入在angular-ui-router.min.js前面。

<script type="text/javascript" src="JS/angular.min.js"></script>
<script type="text/javascript" src="JS/angular-ui-router.min.js"></script>

1.2注入angular模块

var app = angular.module('myApp', ['ui.router']);

注入的名字“ui.router”,可在angular-ui-router.min.js里找到,如下图:

深究AngularJS之ui-router详解

1.3定义视图

ui-view替代的是ngroute路由的ng-view。

<div ui-view></div>

1.4配置路由状态

app.config(["$stateProvider", function ($stateProvider){    
  $stateProvider   
  .state("home", { //导航用的名字,如<a ui-sref="login">login</a>里的login
    url: '/',  //访问路径 
    template:'<div>模板内容......</div>'
  })   

 }]);

2.简单示例

<html>
 <head>  
  <title>ui-router</title>
  <meta http-equiv="pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">  
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  <meta http-equiv="description" content="This is my page">
  <!-- 导入JS -->
  <script type="text/javascript" src="JS/angular.min.js"></script>
  <script type="text/javascript" src="JS/angular-ui-router.min.js"></script> 
 </head>

 <body >  
  <div ng-app="myApp">    
    <div ui-view></div> <!-- 视图 -->   
  </div> 
 </body>


 <script type="text/javascript">
  //定义模板,并注入ui-router
  var app = angular.module('myApp', ['ui.router']);  
  //对服务进行参数初始化,这里配stateProvider服务的视图控制
  app.config(["$stateProvider", function ($stateProvider) {   
    $stateProvider   
    .state("home", {
      url: '/',  
      template:'<div>模板内容......</div>'
    })   
  }]); 
 </script>

</html>

3.嵌套路由的实现

通过url参数的设置实现路由的嵌套(父路由与子路由通过”.“连接就形成了子路由)。嵌套路由可实现多层次的ui-view。

<body >  
  <div ng-app="myApp" >
    <a ui-sref="parent">点我显示父view内容</a>
    <a ui-sref="parent.child">点我显示父view与子view内容</a>
    <div ui-view></div> <!-- 父View -->   
  </div> 
 </body>


 <script type="text/javascript">
  var app = angular.module('myApp', ['ui.router']);  
  app.config(["$stateProvider", function ($stateProvider) {   
    $stateProvider   
    .state("parent", {//父路由
      url: '/parent', 
      template:'<div>parent'
          +'<div ui-view><div>'// 子View
          +'</div>'
    })   
    .state("parent.child", {//子路由
      url: '/child',  
      template:'<div>child</div>'
    })   
  }]);

 </script>

上面的是相对路径方式:

‘parent'将匹配…./index.html#/parent; ‘parent.child'将匹配…./index.html#/parent/child。

若改成绝对路径方式,则需要在子url里加上^:

.state("parent.child", {
  url: '^/child',  
  template:'<div>child</div>'
})

此时,'parent'将匹配…./index.html#/parent; ‘parent.child'将匹配…./index.html#/child。

4. 通过views实现多视图

多个示图时,使用views属性。该属性里包含了哪些ui-view,则对应的template或templateUrl里的内容就会填充该ui-view。

同一个状态下有多个视图示例:

<body >  
  <div ng-app="myApp" >
    <a ui-sref="index">点我显示index内容</a>
    <div ui-view="header"></div> 
    <div ui-view="nav"></div> 
    <div ui-view="body"></div>   
  </div> 
 </body>

 <script type="text/javascript">
  var app = angular.module('myApp', ['ui.router']);  
  app.config(["$stateProvider", function ($stateProvider) {   
    $stateProvider   
    .state("index", {
      url: '/index', 
      views:{
        'header':{template:"<div>头部内容</div>"},
        'nav':{template:"<div>菜单内容</div>"},
        'body':{template:"<div>展示内容</div>"}
      }
    })   

  }]);

 </script>

5.ui-view的定位

@的作用 是用来绝对定位view,即说明该ui-view属于哪个模板。如:'header@index'表示名为header的view属于index模板。绝对和相对路径的效果一样,请看如下代码:

<body >  
  <div ng-app="myApp" >
    <a ui-sref="index">show index</a>
    <a ui-sref="index.content1">content111111</a>
    <a ui-sref="index.content2">content222222</a>
    <div ui-view="index"><div>       
  </div> 
 </body>

 <script type="text/javascript">
  var app = angular.module('myApp', ['ui.router']);  
  app.config(["$stateProvider", function ($stateProvider) {   
    $stateProvider   
    .state("index", {
      url: '/index', 
      views:{
        'index':{template:"<div><div ui-view='header'></div> <div ui-view='nav'></div> <div ui-view='body'></div> </div>"},
        //这里必须要绝对定位
        'header@index':{template:"<div>头部内容header</div>"},
        'nav@index':{template:"<div>菜单内容nav</div>"},
        'body@index':{template:"<div>展示内容contents</div>"}
      }
    })  
    //绝对定位
    .state("index.content1", {
      url: '/content1', 
      views:{
        'body@index':{template:"<div>content11111111111111111</div>"}
        //'body@index'表时名为body的view使用index模板
      }
    }) 
    //相对定位:该状态的里的名为body的ui-view为相对路径下的(即没有说明具体是哪个模板下的)
    .state("index.content2", {
      url: '/content2', 
      views:{
        'body':{template:"<div>content2222222222222222222</div>"}//
      }
    })   

  }]);

 </script>

由上面代码可知,相对定位不能找到的ui-view需要用@来绝对定位。

6.URL路由传参(通过$stateParams服务获取参数)

有url: '/index/:id',和url: '/index/{id}',两种形式传参

<body >  
  <div ng-app="myApp" >
    <a ui-sref="index({id:30})">show index</a>  
    <a ui-sref="test({username:'peter'})">show test</a>
    <div ui-view></div>
  </div> 
 </body>

 <script type="text/javascript">
  var app = angular.module('myApp', ['ui.router']);  
  app.config(["$stateProvider", function ($stateProvider) {   
    $stateProvider   
    .state("home", {
      url: '/', 
      template:"<div>homePage</div>"

    })
    .state("index", {
      url: '/index/:id', 
      template:"<div>indexcontent</div>",
      controller:function($stateParams){
        alert($stateParams.id)
      }
    }) 
    .state("test", {
      url: '/test/:username', 
      template:"<div>testContent</div>",
      controller:function($stateParams){
        alert($stateParams.username)
      }
    })     

  }]);

 </script>

7.Resolve(预载入)

参考资料:

使用预载入功能,开发者可以预先载入一系列依赖或者数据,然后注入到控制器中。在ngRoute中resolve选项可以允许开发者在路由到达前载入数据保证(promises)。在使用这个选项时比使用angular-route有更大的自由度。

预载入选项需要一个对象,这个对象的key即要注入到控制器的依赖,这个对象的value为需要被载入的factory服务。

如果传入的时字符串,angular-route会试图匹配已经注册的服务。如果传入的是函数,该函数将会被注入,并且该函数返回的值便是控制器的依赖之一。如果该函数返回一个数据保证(promise),这个数据保证将在控制器被实例化前被预先载入并且数据会被注入到控制器中。

<body >  
  <div ng-app="myApp" >
    <a ui-sref="index">show index</a>  
    <div ui-view></div>
  </div> 
 </body>

 <script type="text/javascript">
  var app = angular.module('myApp', ['ui.router']);  
  app.config(["$stateProvider", function ($stateProvider) {   
    $stateProvider   
    .state("home", {
      url: '/', 
      template:"<div>homePage</div>"

    })
    .state("index", {
      url: '/index/{id}', 
      template:"<div>indexcontent</div>",
      resolve: {
        //这个函数的值会被直接返回,因为它不是数据保证
        user: function() {
         return {
          name: "peter",
          email: "audiogroup@qq.com"
         }
        },
        //这个函数为数据保证, 因此它将在控制器被实例化之前载入。
        detail: function($http) {
         return $http({
          method: 'JSONP',
          url: '/current_details'
         });
        },
        //前一个数据保证也可作为依赖注入到其他数据保证中!(这个非常实用)
        myId: function($http, detail) {
         $http({
          method: 'GET',
          url: 'http://facebook.com/api/current_user',
          params: {
           email: currentDetails.data.emails[0]
          }
         })
        }

      },
      controller:function(user,detail,myId$scope){
        alert(user.name)
        alert(user.email)
        console.log(detail)
      }
    })         

  }]);

 </script>

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

Javascript 相关文章推荐
juqery 学习之五 文档处理 插入
Feb 11 Javascript
简单的jquery拖拽排序效果实现代码
Sep 20 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
Apr 12 Javascript
jquery实现搜索框常见效果的方法
Jan 22 Javascript
JS实现自适应高度表单文本框的方法
Feb 25 Javascript
javascript基于原型链的继承及call和apply函数用法分析
Dec 15 Javascript
第一个Vue插件从封装到发布
Nov 22 Javascript
Vue封装Swiper实现图片轮播效果
Feb 06 Javascript
js自定义trim函数实现删除两端空格功能
Feb 09 Javascript
layui的select联动实现代码
Sep 28 Javascript
element-ui 本地化使用教程详解
Oct 28 Javascript
OpenLayers3实现对地图的基本操作
Sep 28 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
JS实现json的序列化和反序列化功能示例
Jun 13 #Javascript
angularjs实现搜索的关键字在正文中高亮出来
Jun 13 #Javascript
You might like
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
深入浅析react native es6语法
2015/12/09 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
详解vuex的简单使用
2018/03/12 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
微信小程序当前时间时段选择器插件使用方法详解
2018/12/28 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
Python中的__SLOTS__属性使用示例
2015/02/18 Python
python实现定时播放mp3
2015/03/29 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
Python+Wordpress制作小说站
2017/04/14 Python
Python单体模式的几种常见实现方法详解
2017/07/28 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
2014年维修电工工作总结
2014/11/20 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
管辖权异议上诉状
2015/05/23 职场文书
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python
mysql序号rownum行号实现方式
2022/12/24 MySQL