本系列探寻AngularJS的路由机制,在WebStorm下开发。主要包括:

UI-Router的$state服务
UI-Router的路由事件
UI-Router获取路由参数

AngularJS路由系列包括:

1、AngularJS路由系列(1)--基本路由配置
2、AngularJS路由系列(2)--刷新、查看路由,路由事件和URL格式,获取路由参数,路由的Resolve
3、AngularJS路由系列(3)-- UI-Router初体验
4、AngularJS路由系列(4)-- UI-Router的$state服务、路由事件、获取路由参数
5、AngularJS路由系列(5)-- UI-Router的路由约束、Resolve属性、路由附加数据、路由进入退出事件
6、AngularJS路由系列(6)-- UI-Router的嵌套State

项目文件结构

node_modules/
public/
.....app/
..........bower_components/
...............toastr/
....................toastr.min.css
....................toastr.min.js
...............jquery/
....................dist/
.........................jquery.min.js
...............angular/
....................angular.min.js
...............angular-ui-router/
....................release/
.........................angular-ui-router.min.js
...............angular-route/
.........................angular-route.min.js
..........controllers/
...............HomeController.js
...............AllSchoolsController.js
...............AllClassroomsController.js
...............AllActivityiesController.js
...............ClassroomController.js
...............ClassroomSummaryController.js
...............ClassroomMessageController.js
..........css/
...............bootstrap.cerulean.min.css
..........filters/
...............activityMonthFilter.js
..........services/
...............dataServices.js
...............notifier.js
..........templates/
...............home.html
...............allSchools.html
...............allClassrooms.html
...............allActivities.html
...............classroom.html
...............classroomDetail.html
...............classroom_parent.html
..........app.js
.....index.html
.....favicon.ico
server/
.....data/
.....routes/
.....views/
.....helpers.js
package.json
server.js

UI-Router的$state服务

方法:
● go()  
● reload()
● get()

属性:
● current
● params

事件
● $stateChangeError
● $stateChangeStart
● $stateChangeSuccess
● $stateNotFound

■ index.html, 使用ui-sref

bootstrap.cerulean.min.css
toastr.min.css <!--Angular-->
angular.min.js
angular-ui-router.min.js <!--Application-->
app.js <!--Services-->
dataServices.js
notifier.js <!--Filters-->
activityMonthFilter.js <!--Controls-->
HomeController.js
AllSchoolsController.js
AllClassroomsController.js
AllActivityiesController.js
ClassroomController.js
ClassroomSummaryController.js
ClassroomMessageController.js <body ng-app="app">
<a ui-sref="home">School Buddy</a>
<a ui-sref="schools">Schools</a>
<a ui-sref="classrooms">Classrooms</a>
<a ui-sref="activities">Activities</a> <div ui-view></div>
</body>

■ HomeController.js

(function(){
angular.module('app')
.controller('HomeController', ['dataService', 'notifier', '$state','$log', HomeController]); function HomeController(dataService, notifier, $state, $log){
var vm = this; vm.message = 'Welcome to School Buddy'; //使用$state服务
vm.refresh = function(){
$log.debug($state.current);
$state.reload();
} dataService.getAllSchools()
.then(function(schools){
vm.allSchools = schools;
vm.schoolCount = schools.length;
})
.catch(showError); dataService.getAllClassrooms()
.then(function(classrooms){
vm.allClassrooms = classrooms;
vm.classroomCount = classrooms.length;
})
.catch(showError); ...
}
}());

■ home.html

{{home.message}}
{{home.schoolCount}}
{{home.classroomCount}}
{{home.activityCount}}

<button ng-click="home.refresh()">刷新</button>

点击"刷新"按钮。

可见,$state.reload()方法只刷新路由部分,与浏览器的刷新按钮功能是不一样的。

控制台方面,$state.current代表的当前如下:

UI-Router的路由事件

■ app.js, 给$rootScope添加有关路由的事件

(function(){
var app = angular.module('app',['ui.router']); app.config(['$logProvider', '$stateProvider', function($logProvider, $stateProvider){
$logProvider.debugEnabled(true); $stateProvider
.state('home',{
url: '/',
templateUrl: '/app/templates/home.html',
controller: 'HomeController', //也可以写成HomeController as home
controllerAs: 'home'
})
.state('schools',{
url: '/schools',
controller: 'AllSchoolController',
controllerAs: 'schools',
templateUrl: '/app/templates/allSchools.thml'
})
.state('classrooms',{
url:'/classrooms',
controller: 'AllClassroomsController',
controllerAs: 'classrooms',
templateUrl: '/app/tempates/allClassrooms.html',
resolve: {
promise: function(){
throw 'error activating classrooms';
}
}
})
.state('activities', {
url: '/activities',
controller: 'AllActivitiesController',
controllerAs: 'activities',
templateUrl: '/app/templates/allActivities.html'
})
}]); app.run(['$rootScope', '$log', function($rootScope, $log){
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){
$log.debug('successfully changed states') ; $log.debug('event', event);
$log.debug('toState', toState);
$log.debug('toParams', toParams);
$log.debug('fromState', fromState);
$log.debug('fromParams', fromParams);
}); $rootScope.$on('$stateNotFound', function(event, unfoundState, fromState, fromParams){
$log.error('The request state was not found: ' + unfoundState);
}); $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error){
$log.error('An error occurred while changing states: ' + error); $log.debug('event', event);
$log.debug('toState', toState);
$log.debug('toParams', toParams);
$log.debug('fromState', fromState);
$log.debug('fromParams', fromParams);
});
}]);
}());

■ index.html, 故意制造一个404错误

bootstrap.cerulean.min.css
toastr.min.css <!--Angular-->
angular.min.js
angular-ui-router.min.js <!--Application-->
app.js <!--Services-->
dataServices.js
notifier.js <!--Filters-->
activityMonthFilter.js <!--Controls-->
HomeController.js
AllSchoolsController.js
AllClassroomsController.js
AllActivityiesController.js
ClassroomController.js
ClassroomSummaryController.js
ClassroomMessageController.js <body ng-app="app">
<a ui-sref="home">School Buddy</a>
<a ui-sref="schools">Schools</a>
<a ui-sref="classrooms">Classrooms</a>
<a ui-sref="activitiesAAA">Activities</a> <div ui-view></div>
</body>

在<a ui-sref="activitiesAAA">Activities</a>这里制造了一个404错误。

点击首页的"刷新"按钮。

点击Schools

点击Classroom故意抛出的异常

点击Activities故意抛出404异常。

UI-Router获取路由参数

UI-Router为我们提供了$stateParams服务。

.state('classrooms',{
url: '/classrooms/:id'
})
.state('classrooms',{
url: '/classrooms/{id}'
})
.state('activities',{
url: '/activities',
params: {
id: { value: 42}
}
})

localhost:3000/#/classrooms/3

function ClassroomController($stateParams){
var classroomID = $stateParams.id;
}

■ app.js, 添加带参数的路由

(function(){
var app = angular.module('app',['ui.router']); app.config(['$logProvider', '$stateProvider', function($logProvider, $stateProvider){
$logProvider.debugEnabled(true); $stateProvider
.state('home',{
url: '/',
templateUrl: '/app/templates/home.html',
controller: 'HomeController', //也可以写成HomeController as home
controllerAs: 'home'
})
.state('schools',{
url: '/schools',
controller: 'AllSchoolController',
controllerAs: 'schools',
templateUrl: '/app/templates/allSchools.thml'
})
.state('classrooms',{
url:'/classrooms',
controller: 'AllClassroomsController',
controllerAs: 'classrooms',
templateUrl: '/app/tempates/allClassrooms.html'
})
.state('activities', {
url: '/activities',
controller: 'AllActivitiesController',
controllerAs: 'activities',
templateUrl: '/app/templates/allActivities.html'
})
.state('classroom_summary', {
url: '/classrooms/:id',
templateUrl: '/app/templates/classroom.html',
controller: 'ClassroomController',
controllerAs: 'classroom'
})
}]); app.run(['$rootScope', '$log', function($rootScope, $log){
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){
$log.debug('successfully changed states') ; $log.debug('event', event);
$log.debug('toState', toState);
$log.debug('toParams', toParams);
$log.debug('fromState', fromState);
$log.debug('fromParams', fromParams);
}); $rootScope.$on('$stateNotFound', function(event, unfoundState, fromState, fromParams){
$log.error('The request state was not found: ' + unfoundState);
}); $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error){
$log.error('An error occurred while changing states: ' + error); $log.debug('event', event);
$log.debug('toState', toState);
$log.debug('toParams', toParams);
$log.debug('fromState', fromState);
$log.debug('fromParams', fromParams);
});
}]);
}());

■ ClassroomController.js

(function(){
angular.module('app')
.controller('ClassroomController',['dataService', 'notifier', '$stateParams', ClassroomController]); function ClassroomController(dataService, notifier, $stateParams){
var vm = this; dataService.getClassroom($stateParams.id)
.then(function(classroom){
vm.currentClassroom = classroom;
})
.catch(showError); function showError(message){
notifier.error(message);
} }
}());

■ allClassrooms.html

<tr ng-repeat="classroom in classrooms.allClassrooms">
<td><a href="#/classrooms/{{classroom.id}}/details">{{classroom.name}}</a></td>
<td>{{classroom.school.name}}</td>
<td><a ui-sref="classroom_summary({id: classroom.id})">{{classroom.teacher}}</a></td>
</tr>

在浏览器中输入:localhost:3000/#/classrooms/1

■ app.js, 添加带多个参数的路由

(function(){
var app = angular.module('app',['ui.router']); app.config(['$logProvider', '$stateProvider', function($logProvider, $stateProvider){
$logProvider.debugEnabled(true); $stateProvider
.state('home',{
url: '/',
templateUrl: '/app/templates/home.html',
controller: 'HomeController', //也可以写成HomeController as home
controllerAs: 'home'
})
.state('schools',{
url: '/schools',
controller: 'AllSchoolController',
controllerAs: 'schools',
templateUrl: '/app/templates/allSchools.thml'
})
.state('classrooms',{
url:'/classrooms',
controller: 'AllClassroomsController',
controllerAs: 'classrooms',
templateUrl: '/app/tempates/allClassrooms.html'
})
.state('activities', {
url: '/activities',
controller: 'AllActivitiesController',
controllerAs: 'activities',
templateUrl: '/app/templates/allActivities.html'
})
.state('classroom_summary', {
url: '/classrooms/:id',
templateUrl: '/app/templates/classroom.html',
controller: 'ClassroomController',
controllerAs: 'classroom'
})
.state('classroom_detail',{
url: '/classrooms/{id}/detail/{month}',
templateUrl: '/app/templates/classroomDetail.html',
controller: 'ClassroomController',
controllerAs: 'classroom'
})
}]); app.run(['$rootScope', '$log', function($rootScope, $log){
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){
$log.debug('successfully changed states') ; $log.debug('event', event);
$log.debug('toState', toState);
$log.debug('toParams', toParams);
$log.debug('fromState', fromState);
$log.debug('fromParams', fromParams);
}); $rootScope.$on('$stateNotFound', function(event, unfoundState, fromState, fromParams){
$log.error('The request state was not found: ' + unfoundState);
}); $rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error){
$log.error('An error occurred while changing states: ' + error); $log.debug('event', event);
$log.debug('toState', toState);
$log.debug('toParams', toParams);
$log.debug('fromState', fromState);
$log.debug('fromParams', fromParams);
});
}]);
}());

■ ClassroomController.js, 接受更多的路由参数

(function(){
angular.module('app')
.controller('ClassroomController',['dataService', 'notifier', '$stateParams', ClassroomController]); function ClassroomController(dataService, notifier, $stateParams){
var vm = this; vm.month = $stateParams.month; dataService.getClassroom($stateParams.id)
.then(function(classroom){
vm.currentClassroom = classroom; if($stateParams.month){
if(classroom.activities.length > 0){
vm.timePeriod = dataService.getMonthName($stateParams.month);
} else {
vm.timePeriod = 'No activities this month';
}
}
else{
vm.timePeriod = 'All activities';
}
})
.catch(showError); function showError(message){
notifier.error(message);
} }
}());

■ AllActivitiesController.js

(function(){
angular.module('app')
.controller('AllActivitiesController',['dataService', 'notifier', '$state', AllActivitiesController]); function AllActivitiesController(dataService, notifier, $state){
var vm = this; vm.selectedMonth = 1; vm.search = function(){
$state.go('classroom_detail',{id: vm.selectedClassroom.id, month: vm.seletedMonth});
} dataServie.getAllClassrooms()
.then(function(classrooms){
vm.allClassrooms = classrooms;
vm.selectedClassroom = classrooms[0];
})
.catch(showError); dataService.getAllActivities()
.then(function(activities){
vm.allActivities = activities;
})
.catch(showError); function showError(message){
notifier.error(message);
}
}
}());

浏览器中输入:localhost:3000/#/classrooms/1/detail/12

未完待续~~

AngularJS路由系列(4)-- UI-Router的$state服务、路由事件、获取路由参数的更多相关文章

  1. AngularJS路由系列(6)-- UI-Router的嵌套State

    本系列探寻AngularJS的路由机制,在WebStorm下开发.本篇主要涉及UI-Route的嵌套State. 假设一个主视图上有两个部分视图,部分视图1和部分视图2,主视图对应着一个state,两 ...

  2. spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息

    spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息 本文主要内容: 1:管理页面主机名及访问ip信息提示修改 2:获取当前注册中心的服务列表及每个服务对于的服务提供者列表 ...

  3. AngularJS路由系列(5)-- UI-Router的路由约束、Resolve属性、路由附加数据、路由进入退出事件

    本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router约束路由参数● UI-Router的Resolve属性● UI-Router给路由附加数据● UI- ...

  4. AngularJS路由系列(3)-- UI-Router初体验

    本系列探寻AngularJS的路由机制,在WebStorm下开发. AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新. ...

  5. AngularJS 使用 UI Router 实现表单向导

    Today we will be using AngularJS and the great UI Router and the Angular ngAnimate module to create ...

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

    本文转自:http://www.oschina.net/translate/angularjs-multi-step-form-using-ui-router 今天我们将使用AngularJs和伟大的 ...

  7. angularjs ngRoute和ui.router对比

    ngRoute模块是angularjs自带的路由模块,ui.router是一个第三方路由模块,接下来将对两者进行一个对比: ng-router(angular-router.js) ng-view n ...

  8. AngularJS路由系列(2)--刷新、查看路由,路由事件和URL格式,获取路由参数,路由的Resolve

    本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● 刷新路由● 查看当前路由以及所有路由● 路由触发事件● 获取路由参数 ● 路由的resolve属性● 路由URL格式 ...

  9. AngularJS路由系列(1)--基本路由配置

    本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● 路由的Big Picture ● $routeProvider配置路由 ● 使用template属性 ● 使用temp ...

随机推荐

  1. 升级openssh到最新版本

    首先,下载最新版本,传到服务器:http://mirror.aarnet.edu.au/pub/OpenBSD/OpenSSH/portable/ 安装 cd /root/ mkdir ssh_upg ...

  2. MySQL 5.6.10 跨平台GTID复制实践

    根据业务需要,建立MySQL复制来实现数据冗余. 1:binlog_format   默认值是:statement 有效值: ROW,基于行的复制 STATEMENT 基于语句级别的复制 MASTER ...

  3. springcloud微服务架构搭建:服务调用

    spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign. Ribbon是一个基于HTTP和TCP客户端的负载均衡器,类似nginx反向代理,可 ...

  4. 接收二进制流(ArrayBuffer) ,并且显示二进制流图片

    1.调用接口,返回二进制流数据 var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { && xhr ...

  5. 卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning(转)

    参考:http://blog.csdn.net/xbinworld/article/details/45619685

  6. django之class Meta

    通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model): bar = models.CharFi ...

  7. ECS Navicat for MySQL远程连接报10038的错误

    解决问题时,建议先在阿里云设置好数据库访问的白名单,把自己的IP地址填进去 问题现象 Navicat for MySQL访问远程mysql数据库,出现报错,显示“2003- Can't connect ...

  8. DRF分阶段序列化细化实例

    DRF是分两阶段进行的. 如果是API接收数据,则是先进行Parser,将外界接收的bytes数据分析成python数据类型,其间涉及encoding操作,再进行序列化,将python数据类型保存进数 ...

  9. P1540 机器翻译 模拟

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...

  10. max 基础知识

    MDX基本语法 MD询语句的结构及语法 MDX查询示例 基本的MDX SELECT语句包含一SELELCT字句和一个FROM字句,以及一个可选的WHERE子句.如下 SELECT {[Measures ...