ui router 介绍

1. 路由规则

rap框架页面路由基于ui-router实现

1.1 ui-router

一个基本的路由状态如下所示:


路由配置:

$stateProvider

.state(‘po‘,{

url:‘/po‘,

abstract:false,

templateUrl:‘./pages/master.html‘,

resolve:{

deps:"i am a test"

},

controller:‘po_controller‘

})

前台界面:

<div ui-view></div>

当我们访问index.html/#/po时, ‘po’状态将被激活,同时<div ui-view></div>中的ui-view将被‘./pages/master.html‘填充。

1.1.1 路由说明

路由定义基本参数说明如图1?1所示:

图1?1 参数说明

1.1.2 嵌套结构

默认的嵌套规则是根据 分隔符 ‘.‘ 实现的,


$stateProvider

.state(‘po‘,{

url:‘/po‘,

...

})

.state(‘po.input‘,{

url:‘/input‘,

...

})

.state(‘po.input.mkt‘,{

url:"/mkt",

...

})

以上路由配置表示:

l ‘contacts‘状态将匹配"/contacts"

l ‘contacts.list‘状态将匹配"/contacts/list"。子状态的url是附在父状态的url之后的。

1.1.3 参数使用

1.2 URL参数

1.2.1 基本参数

通常,url动态部分被称为参数,有几个选项用于指定参数。基本参数如下:

1
  2
  3
  4
  5
  6
  7
  8
  9
  10
$stateProvider
      .state(‘contacts.detail‘, {
          // 这里设置了url参数
          url: "/contacts/:contactId",
          templateUrl: ‘contacts.detail.html‘,
          controller: function ($stateParams) {
              // If we got here from a url of /contacts/42
              expect($stateParams).toBe({contactId: 42});
          }
      })

或者,你也可以使用花括号的方式来指定参数:

1
  2
// 与前面的设置方法等效
  url: "/contacts/{contactId}"

示例:

  • ‘/hello/‘ - 只匹配‘/hello/‘路径,没有对斜杠进行特殊处理,这种模式将匹配整个路径,而不仅仅是一个前缀。
  • ‘/user/:id‘ - 匹配‘/user/bob‘‘/user/1234!!!‘,甚至还匹配 ‘/user/‘,但是不匹配‘/user‘‘/user/bob/details‘。第二个路径段将被捕获作为参数"id"
  • ‘/user/{id}‘ - 与前面的示例相同,但使用花括号语法。

1.2.2 含正则表达式的参数

使用花括号的方式可以设置一个正则表达式规则的参数:

1
  2
// 只会匹配 contactId 为1到8位的数字
  url: "/contacts/{contactId:[0-9]{1,8}}"

示例:

  • ‘/user/{id:[^/]*}‘ - 与‘/user/{id}‘相同
  • ‘/user/{id:[0-9a-fA-F]{1,8}}‘ - 与前面的示例相似,但只匹配1到8为的数字和字符
  • ‘/files/{path:.*}‘ - 匹配任何以‘/files/‘开始的URL路径,并且捕获剩余路径到参数‘path‘中。
  • ‘/files/*path‘ - 与前面相同,捕获所有特殊的语法。

警告:不要把捕获圆括号写进正则表达式,ui-router 的 UrlMatcher 将为整个正则表达式添加捕获。

1.2.3 Query Parameters

可以通过?来指定参数作为查询参数

1
  2
url: "/contacts?myParam"
  // 匹配 "/contacts?myParam=value"

如果你需要不止一个查询参数,请用&分隔:

1
  2
url: "/contacts?myParam1&myParam2"
  // 匹配 "/contacts?myParam1=value1&myParam2=wowcool"

1.3 嵌套状态的路由控制

1.3.1 附加的方式(默认)

在嵌套状态的路由控制中,默认方式是子状态的 url 附加到父状态的 url 之后。

1
  2
  3
  4
  5
  6
  7
  8
  9
$stateProvider
    .state(‘contacts‘, {
       url: ‘/contacts‘,
       ...
    })
    .state(‘contacts.list‘, {
       url: ‘/list‘,
       ...
    });

路由将成为:

  • ‘contacts‘状态将匹配"/contacts"
  • ‘contacts.list‘状态将匹配"/contacts/list"。子状态的url是附在父状态的url之后的。

1.3.2 绝对路由(^)

如果你使用绝对 url 匹配的方式,那么你需要给你的url字符串加上特殊符号"^"

1
  2
  3
  4
  5
  6
  7
  8
  9
$stateProvider
    .state(‘contacts‘, {
       url: ‘/contacts‘,
       ...
    })
    .state(‘contacts.list‘, {
       url: ‘^/list‘,
       ...
    });

路由将成为:

  • ‘contacts‘状态将匹配"/contacts"
  • ‘contacts.list‘状态将匹配"/list"。子状态的url没有附在父状态的url之后的,因为使用了^

1.4 $stateParams 服务

之前看到的$stateParams服务是一个对象,包含 url 中每个参数的键/值。$stateParams可以为控制器或者服务提供 url 的各个部分。
注意:$stateParams服务必须与一个控制器相关,并且$stateParams中的“键/值”也必须事先在那个控制器的url属性中有定义。

1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
// 如果状态中 url 属性是:
  url: ‘/users/:id/details/{type}/{repeat:[0-9]+}?from&to‘

  // 当浏览
  ‘/users/123/details//0‘

  // $stateParams 对象将是
  { id:‘123‘, type:‘‘, repeat:‘0‘ }

  // 当浏览
  ‘/users/123/details/default/0?from=there&to=here‘

  // $stateParams 对象将是
  { id:‘123‘, type:‘default‘, repeat:‘0‘, from:‘there‘, to:‘here‘ }

1.4.1 使用$stateParams的两个陷阱

  • 只有当状态被激活并且状态的所有依赖项都被注入时,$stateParams对象才存在。这代表你不能再状态的resolve函数中使用$stateParams对象,可以使用$state.current.params来代替。
  • 在状态控制器中,$stateParams对象只包含那些在状态中定义的参数,因此你不能访问在其他状态或者祖先状态中定义的参数。
1
  2
  3
  4
  5
  6
  7
  8
  9
  10
$stateProvider.state(‘contacts.detail‘, { 
     resolve: {
        someResolve: function($state){
           //*** 不能在这里使用 $stateParams , the service is not ready ***//
           //*** 使用 $state.current.params 来代替 ***//
           return $state.current.params.contactId + "!"
        };
     },
     // ...
  })
1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
$stateProvider.state(‘contacts.detail‘, {
     url: ‘/contacts/:contactId‘,  
     controller: function($stateParams){
        $stateParams.contactId  //*** Exists! ***//
     }
  }).state(‘contacts.detail.subitem‘, {
     url: ‘/item/:itemId‘,
     controller: function($stateParams){
        $stateParams.contactId //*** 注意! DOESN‘T EXIST!! ***//
        $stateParams.itemId //*** Exists! ***// 
     }
  })

1.5 $urlRouterProvider

$urlRouterProvider负责处理在状态配置中指定的url路由方式之外的 url 请求的路由方式。$urlRouterProvider负责监视$location,当$location改变后,$urlRouterProvider将从一个列表,一个接一个查找匹配项,直到找到。所有 url 都编译成一个UrlMatcher对象。

$urlRouterProvider有一些实用的方法,可以在module.config中直接使用。

when() for redirection 重定向

参数:

  • what String | RegExp | UrlMatcher,你想重定向的传入路径
  • handler String | Function 将要重定向到的路径

handler 作为 String
如果handler是字符串,它被视为一个重定向,并且根据匹配语法决定重定向的地址。

1
  2
  3
  4
  5
  6
  7
app.config(function($urlRouterProvider){
      // when there is an empty route, redirect to /index  
      $urlRouterProvider.when(‘‘, ‘/index‘);

      // You can also use regex for the match parameter
      $urlRouterProvider.when(‘/aspx/i‘, ‘/index‘);
  })

handler 作为 Function
如果handler是一个函数,这个函数是注入一些服务的。如果$location匹配成功,函数将被调用。你可以选择性注入$match

函数可以返回:

  • falsy 表明规则不匹配,$urlRouter将试图寻找另一个匹配
  • String 该字符串作为重定向地址并且作为参数传递给$location.url()
  • nothing或者任何为真的值,告诉$urlRouterurl 已经被处理

示例:

1
  2
  3
  4
  5
$urlRouterProvider.when(state.url, [‘$match‘, ‘$stateParams‘, function ($match, $stateParams) {
      if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
          $state.transitionTo(state, $match, false);
      }
  }]);

otherwise() 无效路由

参数:

  • path String | Function 你想重定向url路径或者一个函数返回url路径。函数可以包含$injector$location两个参数。
1
  2
  3
  4
  5
  6
  7
  8
  9
  10
app.config(function($urlRouterProvider){
      // 在配置(状态配置和when()方法)中没有找到url的任何匹配
      // otherwise will take care of routing the user to the specified url
      $urlRouterProvider.otherwise(‘/index‘);

      // Example of using function rule as param
      $urlRouterProvider.otherwise(function($injector, $location){
          ... some advanced code...
      });
  })

rule() 自定义url处理

参数:

  • handler Function 一个函数,包含$injector$location两个服务作为参数,函数负责返回一个有效的路径的字符串。
1
  2
  3
  4
  5
  6
  7
app.config(function($urlRouterProvider){
      // Here‘s an example of how you might allow case insensitive urls
      $urlRouterProvider.rule(function ($injector, $location) {
          var path = $location.path(), normalized = path.toLowerCase();
          if (path != normalized) return normalized;
      });
  })

1.6 $urlMatcherFactory 和 UrlMatchers

定义了url模式和参数占位符的语法。$urlMatcherFactory是在幕后被$urlRouterProvider调用,来缓存编译后的UrlMatcher对象,而不必在每次 location 改变后重新解析url。大多数用户不需要直接使用$urlMatcherFactory方法,但是在状态配置中非常实用,可以使用$urlMatcherFactory方法来生成一个UrlMatcher对象,并在状态配置中使用该对象。

1
  2
  3
  4
var urlMatcher = $urlMatcherFactory.compile("/home/:id?param1");
  $stateProvider.state(‘myState‘, {
      url: urlMatcher
  });
时间: 2024-08-04 17:17:47

ui router 介绍的相关文章

ngRoute 和 ui.router 的使用方法和区别

在单页面应用中要把各个分散的视图给组织起来是通过路由机制来实现的.本文主要对 AngularJS 原生的 ngRoute 路由模块和第三方路由模块 ui.router 的用法进行简单介绍,并做一个对比. ngRoute 使用方法 1) 引入 angular-route lib 无论是 ngRoute 还是 ui.router ,作为框架额外的附加功能,都必须以 模块依赖 的形式被引入. 1 <script src="lib/angular-route.js"></sc

微信公众号 几种移动端UI框架介绍

微信公众号开发,主要是移动端网页的页面开发,在这里推荐3个移动端UI框架:WeUI.SUI和Mint UI. 1. WeUI 1.1 WeUI WeUI是微信官方设计团队为微信 Web 开发量身设计,可以令用户在HTML5应用中的使用感知更加统一. 组件包含button.cell.dialog. progress, toast.article.icon等等. 资源 官方Demo:https://weui.io/ Github:https://Github.com/weui/weui (★1340

Angularjs中UI Router全攻略

摘自:Angularjs中UI Router全攻略 温馨提示:想要了解 angular-ui-router的同学,从上往下读一遍,能带随着coding那就更好了,保证你对angular-ui-router基本全部掌握. 如何引用依赖angular-ui-router angular.module('app',["ui.router"]) .config(function($stateProvider){ $stateProvider.state(stateName, stateCofi

angular : $location &amp; $state(UI router)的关系

次序:angular 的 location会先跑 $rootScope.$on("$locationChangeStart", function (scope, newUrl, oldUrl) { log("$locationChangeStart from " + oldUrl) log("$locationChangeStart to " + newUrl) }); 接着是 ui router $state $rootScope.$on(&q

Angularjs中UI Router用法小记录

今天自己参考已有的项目代码学习了下UI Router的用法,写了个小demo,验证了下自己的想法,现把使用情况记录一下. 1.入口文件index.html,引入项目所需的js文件,标注ng-app,创建ui-view元素,为后面的嵌套做容器准备. <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <meta charset="UTF-8">

[转]AngularJS 使用 UI Router 实现表单向导

本文转自:http://www.oschina.net/translate/angularjs-multi-step-form-using-ui-router 今天我们将使用AngularJs和伟大的UI Router以及Angular ngAnimate module创建一个带动画的多步表单.这项技术可以用在你想要简化用户操作的大表单上. 我们看到这项技术已经应用在了许多的网页上.比如购物车,注册表单,入职流程以及许多多步表单,让用户更容易在线填写表单. 下面我们将构建它: 使用UI Rout

angular 的ui.router 定义不同的state 对应相同的url

Angular UI Router: Different states with same URL? The landing page of my app has two states: home-public, home-logged-in. Now I want to show both states on the same URL, but let the controller and template depend on the user session (is the user log

iOS开发UI—UIWindow介绍

一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow.也就说,没有UIWindow,就看不见任何UI界面 补充:UIWindow是创建的第一个视图控件(创建的第一个对象是UIapplication)如下图:

Ligg.EasyWinApp-100-Ligg.EasyWinForm:一款Winform应用编程框架和UI库介绍

本项目是一个Winform应用编程框架和UI库.通过这个该框架,不需任何代码,通过XML配置文件,搭建任意复杂的Windows应用界面,以类似Execel公式的方式实现基本的过程控制(赋值.条件判断.循环.跳转)和功能(字符处理.文件处理.Windows脚本执行.逻辑运算.数学运算.数据输入输出-支持String.Jonson.DataTable类型的数据):动态加载“即插即用“的.Net组件实现特定的业务处理功能:支持多线程.多语言. 程序启动运行示意图: **说明:SeqExec.exe是一