AngularJS 路由(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在现代 Web 开发中,单页应用(SPA)因其流畅的用户体验和高效的资源利用而备受青睐。AngularJS 作为早期的主流前端框架,其路由系统为开发者提供了强大的导航管理能力。本文将从基础概念出发,逐步讲解如何通过 AngularJS 路由实现页面跳转、参数传递、动态加载等功能,并结合实际案例帮助读者快速上手。无论你是编程新手还是有一定经验的开发者,都能通过本文掌握 AngularJS 路由的核心逻辑。
AngularJS 路由的核心概念
1. 什么是路由?
路由(Routing)是 Web 应用中控制页面跳转和视图切换的核心机制。在传统多页应用(MPA)中,每次跳转都会重新加载整个页面,而单页应用通过路由实现局部更新,仅加载和渲染需要变化的组件,从而提升性能。
在 AngularJS 中,路由由 ngRoute
模块提供支持。它将 URL 地址与视图(View)和控制器(Controller)关联,形成“URL → 组件”的映射关系。例如,访问 /users
时,路由会加载用户列表的 HTML 模板和对应的控制器逻辑。
比喻:路由系统就像一座城市的导航系统。URL 是目的地的地址,而路由引擎则是司机,根据地址找到对应的“目的地”(视图和逻辑),最终让用户看到正确的界面。
2. 核心组件与流程
AngularJS 路由主要依赖以下三个关键组件:
组件名称 | 作用 |
---|---|
$routeProvider | 配置路由规则,将 URL 路径与视图、控制器绑定。 |
$route | 提供当前路由的参数和信息,如 current 属性存储激活的路由状态。 |
$location | 操作浏览器地址栏,支持 URL 的读写和监听,是路由的核心驱动引擎。 |
工作流程:
- 用户访问 URL,触发
$location
监听事件。 - AngularJS 根据 URL 匹配路由表中的路径规则。
- 加载匹配路径对应的模板(HTML)和控制器(JS)。
- 将模板渲染到
<div ng-view></div>
容器中(默认容器)。
AngularJS 路由的配置方法
1. 模块配置与路由表
步骤 1:引入 ngRoute
模块
在 AngularJS 项目中,需先通过 angular.module
注册依赖:
var app = angular.module('myApp', ['ngRoute']);
步骤 2:配置路由规则
通过 .config()
方法注入 $routeProvider
,定义路由表:
app.config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/home', {
templateUrl: 'views/home.html',
controller: 'HomeController'
})
.when('/about', {
templateUrl: 'views/about.html',
controller: 'AboutController'
})
.otherwise({
redirectTo: '/home' // 默认跳转路径
});
}]);
关键参数说明:
templateUrl
:指向 HTML 模板文件的路径。controller
:绑定的控制器名称。resolve
(可选):在路由激活前执行异步操作(如 API 请求)。
比喻:路由表就像一本电话簿,记录着每个 URL 对应的“联系人”(模板和控制器)。当用户拨打电话(访问 URL)时,系统会自动找到对应的联系人并建立连接。
2. 路由参数与动态路径
路径参数(Path Parameters)
通过 :paramName
在路径中定义动态参数,例如:
$routeProvider.when('/user/:id', { /* ... */ });
在控制器中,可通过 $routeParams
服务获取参数值:
app.controller('UserController', ['$scope', '$routeParams', function($scope, $routeParams) {
$scope.userId = $routeParams.id; // 获取 URL 中的用户 ID
}]);
查询参数(Query Parameters)
URL 中的查询参数(如 ?page=2
)可通过 $location.search()
获取:
var page = $location.search().page; // 获取 page 参数的值
案例:假设用户访问 /user/123?theme=dark
,则:
:id
对应123
,存储在$routeParams.id
。theme=dark
存储在$location.search().theme
。
3. 懒加载与异步加载
通过 resolve
属性实现路由的懒加载,即在路由激活前动态加载资源:
$routeProvider.when('/products', {
templateUrl: 'views/products.html',
controller: 'ProductsCtrl',
resolve: {
productsData: ['$http', function($http) {
return $http.get('/api/products'); // 等待 API 响应后再渲染页面
}]
}
});
在控制器中,可以直接使用 productsData
:
app.controller('ProductsCtrl', ['$scope', 'productsData', function($scope, productsData) {
$scope.products = productsData.data;
}]);
优势:避免在页面加载时一次性加载所有资源,提升初始加载速度。
AngularJS 路由的高级技巧
1. 路由守卫(Route Guards)
通过 resolve
或自定义服务实现路由权限控制。例如,仅允许已登录用户访问 /dashboard
:
app.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/dashboard', {
templateUrl: 'views/dashboard.html',
controller: 'DashboardCtrl',
resolve: {
authCheck: ['AuthService', function(AuthService) {
if (!AuthService.isLoggedIn()) {
window.location.href = '/login'; // 未登录时跳转到登录页
}
}]
}
});
}]);
2. 嵌套路由(Nested Routes)
通过 views
属性实现多级路由,例如在 /users
页面中嵌套 /users/profile
:
$routeProvider.when('/users', {
templateUrl: 'views/users.html',
controller: 'UsersCtrl',
resolve: { /* ... */ },
views: {
'profile@users': {
templateUrl: 'views/user-profile.html',
controller: 'UserProfileCtrl'
}
}
});
注意:嵌套路由需在父模板中定义 <div ui-view="profile"></div>
。
实战案例:构建用户管理系统
1. 项目结构
my-app/
├── index.html
├── scripts/
│ └── app.js
└── views/
├── home.html
├── users.html
└── user-detail.html
2. 配置路由表(app.js)
var app = angular.module('userApp', ['ngRoute']);
app.config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/home.html',
controller: 'HomeCtrl'
})
.when('/users', {
templateUrl: 'views/users.html',
controller: 'UsersCtrl',
resolve: {
users: ['$http', function($http) {
return $http.get('/api/users');
}]
}
})
.when('/users/:id', {
templateUrl: 'views/user-detail.html',
controller: 'UserDetailCtrl'
})
.otherwise({ redirectTo: '/' });
}]);
3. 控制器逻辑
// HomeCtrl.js
app.controller('HomeCtrl', ['$scope', function($scope) {
$scope.message = "Welcome to User Management System!";
}]);
// UsersCtrl.js
app.controller('UsersCtrl', ['$scope', 'users', function($scope, users) {
$scope.users = users.data;
}]);
// UserDetailCtrl.js
app.controller('UserDetailCtrl', ['$scope', '$routeParams', function($scope, $routeParams) {
$scope.userId = $routeParams.id;
}]);
4. HTML 模板示例(users.html)
<div>
<h2>User List</h2>
<ul>
<li ng-repeat="user in users">
<a ng-href="/users/{{user.id}}">{{user.name}}</a>
</li>
</ul>
</div>
结论
AngularJS 路由是构建单页应用的核心能力之一。通过本文的讲解,读者可以掌握从基础配置到高级功能的完整流程,并通过实际案例理解路由参数、懒加载和权限控制等关键技巧。
对于初学者,建议从简单路由开始,逐步尝试参数化路径和动态加载;中级开发者则可探索嵌套路由和自定义守卫,以满足复杂业务需求。随着 AngularJS 的逐渐退出主流,但其路由设计理念仍对现代框架(如 Angular 和 Vue Router)有重要影响,掌握其原理能为后续学习打下坚实基础。
希望本文能帮助你顺利实现 AngularJS 路由的开发,打造流畅的单页应用体验!