`

angular 之 ui-router路由

 
阅读更多

转自:http://yijiebuyi.com/blog/3aab7ad8bccb22b4a881849c0593d5e2.html

angular.js 为我们封装好了一个路由工具 ngRoute ,它是一种靠url改变去驱动视图.

angularUI 也为我们封装了一个独立的路由模块 ui-router ,它是一种靠状态 state 来驱动视图.

后者有什么优势:一个页面可以嵌套多个视图,多个视图去控制某一个视图等.

 

ngRoute

使用时需要ui中用ng-view指令指定 如:<div ng-view></div>

url改变此区域会被刷新.

首先要配置注册 ngRoute 

var app = angular.module(“YIJIEBUYI", ['ngRoute']);                app.config(function ($locationProvider) { 

 

});

 

路由设置:

angular.module(‘YIJIEBUYI').config(['$urlRouterProvider',

function($urlRouterProvider) {

$urlRouterProvider

.when(“/blog", “/blog/index")

.otherwise("/blog/index");

});

 

ui-router

使用时需要ui中用ui-view指令指定 如:<div ui-view></div>

需要下载 ui-route 文件.

首先配置注册 ui-route

var app = angular.module(“YIJIEBUYI", [‘ui.router']);
    app.config(function () { 
    //路由配置
});
 

 

路由设置:

angular.module(‘YIJIEBUYI').config(['$stateProvider',
function($stateProvider) {
    $stateProvider.state('blog',{
        url:'/blog',
        views:{
            'container':{templateUrl:'templates/blog/layout.html'}
        }
    }).state('blog.index',{
        url:'/index',
        views:{
            'container':{templaterUrl:'templates/blog/index.html'}
        }
    })
});
 

 

ngRoute  和  ui-route 相比:

$route       —>   $state

$routeParams      —>  $stateParams

$routeProvider      —>  $stateProvider

<div ng-view></div>      —>  <div ui-view></div>

 

设置路由相比:

$urlRouterProvider.otherwise('/blog/index');  设置默认路由还需要使用ngRoute来设置.

 

$stateProvider.state(‘blog.index', {url:’….’,views:{模板路径}); 见上面设置信息.

 

所以我们在上一篇博文简单介绍 ui-route路由控制器中既使用了ngRoute 也使用了 ui-route,就是因为

设置默认页还是要用到 ngRoute工具.

 

下面详细说下 ui-route 使用:

(1)父路由,子路由

ui-route子路由可以继承父路由,也就是说 state 设置可以嵌套,通过名称中的.(点)来区分层次.

如下面路由:

angular.module(‘YIJIEBUYI').config(['$stateProvider',
function($stateProvider) {
    $stateProvider.state('blog',{
        url:'/blog',
        views:{
            'container':{templateUrl:'templates/blog/layout.html'}
        }
    }).state('blog.index',{
        url:'/index',
        views:{
            'container':{templaterUrl:'templates/blog/index.html'}
        }
    })
});
 

 

blog 对应的路由是 /blog

blog.index 对应的路由就是 /blog/index  (前面的/blog就是从父view中继承过来的)

blog.index 就是 blog的子view

 

(2)指定响应的view

<div ui-view="view1"></div> 
<div ui-view="view2"></div>
 
.state("blog.detail"),{  
    url:”/:blogID"  
    ,views:{  
        view1:{  
            templateUrl:"view1.html" 
        }  
        ,view2:{  
            templateUrl:"view1.html"  
        }  
    }  
}
 

 

(3) state 配置参数

url:默认相对路径(以^开头的是绝对路径) 

views:每个子视图可以包含自己的模板、控制器和预载入数据。 (后2项选填,控制器可以在view中绑定)

abstract:抽象模板不能被激活 

template: HTML字符串或者返回HTML字符串的函数

如:

$stateProvider.state(‘blog.detail', {
  template: '<h1>My Blog</h1>'
})
 

templateUrl: HTML模板的路径或者返回HTML模板路径的函数

如:

$stateProvider.state(‘blog.detail', {
  templateUrl: ’templates/blog_detail.html'
})
 

 

templateProvider:返回HTML字符串的函数 

如:通过函数返回html

$stateProvider.state(‘blog.detail', {
  templateProvider: function ($timeout, $stateParams) {
    return $timeout(function () {
      return '<h1>' + $stateParams.blogID + '</h1>'
    }, 100);
  }
})
 

 

controller、controllerProvider:指定任何已经被注册的控制器或者一个作为控制器的函数 

resolve:在路由到达前预载入一系列依赖或者数据,然后注入到控制器中。 

data:数据不会被注入到控制器中,用途是从父状态传递数据到子状态。 

onEnter/onExit:进入或者离开当前状态的视图时会调用这两个函数 

 

(4)解决器 Resolve

可以使用 Resolve 为控制器提供可选的依赖注入项。

Relolve 是由 key/value 组成的键值对象.

key  – {string}:注入控制器的依赖项名称。

value - {string|function}:

string:一个服务的别名

function:函数的返回值将作为依赖注入项,如果函数是一个耗时的操作,那么控制器必须等待该函数执行完成(be resolved)才会被实例化。

比如,博客后台的视图都需要登录用户才能访问,那么判断是否登录就可以做成一个控制器依赖

$stateProvider.state(‘YIJIEBUYI', {
    url: “/admin",
    // 登录后才能访问
    resolve: {authentication:[‘YijiebuyiAuth', '$q', function(YijiebuyiAuth, $q){
        return $q.when().then(function(){
            return YijiebuyiAuth.authentication();
        });
    }]},
    views: {
        container: { templateUrl: “templates/admin_manage.html" }
    }
})
 

在上面的返回函数中我们注入了一个服务 YijiebuyiAuth ,这个服务里实现了登录判断的方法 authentication

 

 

(5)$state 对象提供自定义数据

$stateProvider
  .state(‘blog.index', {
    templateUrl: ’templates/blog_index.html',
    data: {
        current_page: 1,
        page_size: 20
    } 
})
 

上面 data 对象就是自定义数据,

里面定义了2页面的当前页和显示内容条数

 

在视图对应的 controller 中我们就可以通过下面的方法来获取自定义数据.

console.log($state.current.data.current_page);  // 1
console.log($state.current.data.page_size);  // 20
 

 

 

(5) onEnter 和 onExit 回调函数

onEnter: 当状态活跃时触发 什么是活跃???页面正在加载中…..我也求解!

onExit : 当状态不活跃时触发 什么是不活跃?? 页面加载完成...同求解!

$stateProvider.state("blog.detail", {
  template: '<h1>blog</h1>',
  resolve: { title: '蚂蚁' },
  controller: function($scope, title){
    $scope.title = title;
  },
  // title 是解决依赖项注入控制器
  onEnter: function(title){ 
    if(title){ ... do something ... }
  },
  // title 是解决依赖项注入控制器
  onExit: function(title){
    if(title){ ... do something ... }
  }
})
 

 

所以,刚才上面做的解决依赖判断是否登录,完全可以在 onEnter 事件中判断登录状态,如果未登录,直接跳转到其他路由即可.

 

 

(6) 页面跳转

<a href="#/blog/1234”>博客详情</a> 
<a ui-sref=“blog.detail({blogID:blogID})”>博客详情</a>
 
$state.go(‘blog.detail', {blogID:blogID});

 

(7) 事件

state事件 

 

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ ... })

$rootScope.$on('$stateNotFound', function(event, unfoundState, fromState, fromParams){ ... })

$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){ ... })

$rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error){ ... })

 

view事件 

View被加载但是DOM树构建之前时: 

$scope.$on('$viewContentLoading', function(event, viewConfig){ ... }); 

View被加载而且DOM树构建完成时: 

$scope.$on('$viewContentLoaded', function(event){ ... }); 

 

分享到:
评论

相关推荐

    前端项目-angular-ui-router.zip

    总的来说,`angular-ui-router.zip`包含的UI-Router库为AngularJS应用提供了强大的路由功能,使得开发者能够构建结构清晰、易于维护的前端项目。这个压缩包中的`ui-router-master`可能包括源代码、文档、示例以及...

    Angular-UI-Router包

    UI-Router被认为是AngularUI为开发者提供的最实用的一个模块,它是一个让开发者能够根据URL状态或者说是'机器状态'来组织和控制界面UI的渲染,而不是仅仅只改变路由(传统AngularJS应用实用的方式)。该模块为开发者...

    angularjs+require+angular-ui-router

    3. **Angular-UI-Router**:虽然AngularJS原生的路由系统已经很强大,但Angular-UI-Router提供了更高级的状态管理功能。它可以处理更复杂的导航结构,如嵌套路由,允许在同一个视图中展示多个子视图,并支持命名视图...

    angular-ui-router.zip

    Angular UI Router是AngularJS框架的一个强大路由模块,它为Angular应用程序提供了更灵活和强大的状态管理机制,使得在构建单页面应用(SPA)时能够更好地组织和管理页面间的导航。相比Angular内置的$router服务,UI...

    angular.js ui-router 用法示例demo

    而“angular.js ui-router”是AngularJS路由的增强版,它引入了更丰富的概念,如状态管理,使开发人员能够更好地控制应用程序的导航流程。 UI-Router的核心概念包括: 1. **状态(States)**:状态代表应用程序的...

    Angularjs和ui-router的一个栗子

    var app = angular.module('myApp', ['ui.router']); ``` 接着,你需要配置UI-Router的状态。状态可以通过`.state()`方法定义,其中包含`name`、`url`、`templateUrl`和`controller`等属性。 ```javascript app....

    前端项目-angular-ui-router-default.zip

    "前端项目-angular-ui-router-default.zip" 是一个与前端开发相关的压缩文件,主要涉及的技术是 AngularJS 的 UI-Router 模块。"default" 在这里指的是该模块可能用于设置默认的子视图,特别是在处理抽象状态时。 *...

    Angular.js中angular-ui-router的简单实践

    angular-ui-router的使用方法有很多,此文中,我们直接在控制器中使用,并完成一个简单的路由。 文中 Angular.js 的版本为 1.5.2 下载和安装 直接通过 bower 来安装 angular-ui-router 使用 bower 安装 angular-...

    angular-ui-route-v1.0.0-rc.1

    《AngularJS中的UI-Router详解:以angular-ui-route-v1.0.0-rc.1为例》 在前端开发领域,AngularJS作为一个强大的MVC框架,因其强大的数据绑定和依赖注入特性而广受青睐。而在AngularJS的应用中,路由管理是不可或...

    前端项目-angular-ui-router-title.zip

    在本文中,我们将深入探讨基于AngularJS的前端项目——Angular UI Router Title,它是一个用于根据当前UI路由器状态动态更新浏览器标题和历史记录的模块。这个模块对于构建具有多个视图和路由的复杂单页应用程序...

    angularjs ui.router嵌套路由demo

    AngularJS UI.Router是一个强大的路由模块,它为AngularJS应用程序提供了更复杂的导航结构和状态管理功能。这个"angularjs ui.router嵌套路由demo"是展示如何在AngularJS项目中使用UI.Router进行多级路由配置和页面...

    angular-ui-router-css:用于 AngularJS UI 路由器的 CSS 解析器

    angular-ui-router-css用于 AngularJS UI 路由器的 CSS 解析器。 在路由状态更改之前解析您的 css。 安装使用安装和管理。 bower instal angular-ui-router-css --save如何使用它将angular-ui-router-css.js到您的...

    angular_ui-router_bootstrap-tabs

    标题“angular_ui-router_bootstrap-tabs”指的是一个使用AngularJS、UI-Router和Bootstrap Tab插件的项目,这个项目展示了如何在AngularJS应用中结合使用这些技术来构建动态的、基于路由的选项卡式用户界面。...

    angular-ui-router-examples:学习使用ui-router。 代码基于FunnyAnt 的博客文章

    AngularJS UI-Router 是一个强大的路由库,专为AngularJS应用程序设计,用于处理单页应用(SPA)中的页面导航和状态管理。它扩展了AngularJS的内置路由功能,提供了更灵活和可配置的路由机制。在本文中,我们将深入...

    ui-router使用教程

    UI-Router 是 AngularJS 框架中的一个强大的路由插件,它提供了更灵活的导航和视图管理机制,能够实现类似 frameset 的效果,即在不重新加载整个页面的情况下,进行页面内部的局部跳转。在深入探讨 UI-Router 的用法...

    Angular路由ui-router配置详解

    angularJs自身提供路由ng-router,但是ng-router不是很好用,配置项零散,好比Vue提供的组件传值一样,虽然提供给你了用法,但是开发过程中逻辑一多用着萌萌的,所以我们抛开ng-router来看ui-router。 引入ui-router ...

    angularjs文件及参考文档ui-router

    3. **angular-ui-router.min.js**:UI-Router是AngularJS的一个第三方模块,专门用于处理更复杂的路由需求。原生的ngRoute仅支持简单的URL到控制器的映射,而UI-Router则增加了状态管理、嵌套路由、命名视图等功能。...

    angular ui-route

    UI-Router的工作原理与Angular原生的路由控制器相似,但更专注于状态管理。通过定义`controller`、`template`和`view`等属性,UI-Router能够精确控制特定位置的用户界面和交互行为。 #### 二、状态管理 在UI-...

Global site tag (gtag.js) - Google Analytics