AngularJS(通常被称为 Angular 1.x)是由 Google 维护的一个前端 JavaScript 框架,它极大地改变了早期前端开发的方式,引入了数据绑定、依赖注入、指令、模块化等核心概念,是现代前端框架(如 Angular, Vue, React)的重要先驱。

尽管 AngularJS 已经不再是主流(官方已于 2025 年停止支持),但仍有大量存量项目在使用,学习它有助于理解前端框架的演进史,并且在维护旧项目时非常有用。
下面我将从核心理念、开发流程、实战步骤、进阶主题和重要提醒五个方面,为你详细讲解如何使用 AngularJS 开发网站。
AngularJS 核心理念(为什么它与众不同)
在开始写代码之前,理解这些核心概念至关重要。
-
MVC (Model-View-Controller) 模式
(图片来源网络,侵删)- Model (模型): 你的数据,通常是 JavaScript 对象或数组,负责存储应用的状态。
- View (视图): 用户看到的界面,主要是 HTML,但其中包含了 AngularJS 的特殊指令,用于绑定数据。
- Controller (控制器): 桥梁,是 JavaScript 函数,负责初始化 Model,并将 Model 的数据传递给 View,View 中的用户交互(如点击)也会通过 Controller 来改变 Model。
-
数据绑定
- 这是 AngularJS 最神奇的功能,你不需要手动操作 DOM 来更新视图。
- 双向数据绑定: 当 Model 数据变化时,View 会自动更新;反之,当 View 中的输入框内容变化时,Model 数据也会自动同步,这大大减少了代码量。
-
指令
- AngularJS 扩展了 HTML 的功能,指令是特殊的 HTML 属性(如
ng-app,ng-model,ng-repeat),它们为元素添加了特定行为。 - 内置指令:
ng-app(启动应用),ng-model(绑定数据),ng-bind(安全地显示数据),ng-repeat(循环渲染列表),ng-click(绑定点击事件) 等。 - 自定义指令: 你可以创建自己的指令来封装可复用的 UI 组件。
- AngularJS 扩展了 HTML 的功能,指令是特殊的 HTML 属性(如
-
模块
模块是你的应用程序的容器,它可以帮助你组织代码、管理依赖关系,并避免全局变量污染,一个 AngularJS 应用通常由一个或多个模块组成。
-
依赖注入
- 这是一种设计模式,也是 AngularJS 的核心,你只需要声明你的组件(如 Controller)需要什么服务(如
$http用于网络请求),AngularJS 会自动将“依赖”的实例“注入”到你的组件中,你不需要自己创建这些服务,这使得代码更易于测试和维护。
- 这是一种设计模式,也是 AngularJS 的核心,你只需要声明你的组件(如 Controller)需要什么服务(如
开发环境与工具
-
文本编辑器/IDE:
- VS Code: 强烈推荐,插件丰富,对 AngularJS 支持良好。
- WebStorm: JetBrains 出品,功能强大,是 AngularJS 开发的专业选择。
- Sublime Text / Atom: 轻量级编辑器。
-
必备浏览器插件:
- Batarang: AngularJS 官方出品的调试工具,可以查看作用域、性能分析等,对于调试 AngularJS 应用至关重要。
-
包管理器:
- npm (Node Package Manager): 用于管理 JavaScript 库和工具,虽然 AngularJS 项目不强制要求,但现代前端开发流程(如构建、测试)通常离不开它。
-
构建工具 (可选但推荐):
- 对于大型项目,手动管理脚本和样式会很麻烦,可以使用 Gulp 或 Grunt 等构建工具来合并、压缩文件,并处理其他任务。
从零开始:AngularJS 网站开发实战步骤
假设我们要开发一个简单的“待办事项列表”网站。
步骤 1:项目结构与 HTML 搭架
创建一个基本的 HTML 文件 index.html,AngularJS 应用需要在一个根元素上启动,这个元素通常由 ng-app 指令定义。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">AngularJS Todo App</title>
<style>
/* 一些简单的样式 */
body { font-family: Arial, sans-serif; }
.todo-item { padding: 8px; border-bottom: 1px solid #ccc; }
.todo-item input { margin-right: 10px; }
</style>
</head>
<body>
<!-- 1. ng-app 指令:告诉 AngularJS 这个 div 是应用的根 -->
<div ng-app="todoApp">
<h1>我的待办事项</h1>
<!-- 3. ng-controller 指令:为这个区域指定一个控制器 -->
<div ng-controller="TodoController as todo">
<!-- 4. ng-model 指令:将输入框的值绑定到控制器中的 newTodo.text -->
<input type="text" ng-model="todo.newTodo.text" placeholder="添加新任务...">
<button ng-click="todo.addTodo()">添加</button>
<ul>
<!-- 5. ng-repeat 指令:循环渲染 todos 数组中的每一项 -->
<li class="todo-item" ng-repeat="item in todo.todos">
<input type="checkbox" ng-model="item.done">
<span ng-class="{ 'done': item.done }">{{ item.text }}</span>
<button ng-click="todo.removeTodo($index)">删除</button>
</li>
</ul>
</div>
</div>
<!-- 2. 引入 AngularJS 库 -->
<!-- 从 CDN 引入是最简单的方式 -->
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<!-- 我们将在下一步创建这个 JS 文件 -->
<script src="app.js"></script>
</body>
</html>
步骤 2:创建 JavaScript 模块和控制器
创建一个 app.js 文件,在这里我们将定义模块和控制器逻辑。
// app.js
// 1. 创建并配置一个名为 'todoApp' 的模块
// [] 表示没有依赖其他模块
var app = angular.module('todoApp', []);
// 2. 定义一个名为 'TodoController' 的控制器
// $scope 是 AngularJS 提供的一个特殊对象,是 Controller 和 View 之间的桥梁
app.controller('TodoController', function($scope) {
// 在 $scope 上定义数据,这样 View 就能访问到
$scope.todos = [
{ text: '学习 AngularJS', done: false },
{ text: '构建一个应用', done: false }
];
$scope.newTodo = { text: '' };
// 在 $scope 上定义方法,这样 View 就能调用
$scope.addTodo = function() {
if ($scope.newTodo.text.trim() !== '') {
$scope.todos.push({
text: $scope.newTodo.text,
done: false
});
// 清空输入框
$scope.newTodo.text = '';
}
};
$scope.removeTodo = function(index) {
$scope.todos.splice(index, 1);
};
});
注意: 上面是使用 $scope 的经典写法,你也可以使用 "Controller as" 语法,这在 index.html 中已经有所体现 (ng-controller="TodoController as todo"),这种语法更易于理解,因为它将控制器实例化为一个对象。
修改后的 app.js (Controller as 语法):
// app.js (Controller as 语法)
var app = angular.module('todoApp', []);
app.controller('TodoController', function() { // 不再需要注入 $scope
var vm = this; // vm = ViewModel (视图模型),是 this 的一个别名,约定俗成
vm.todos = [
{ text: '学习 AngularJS', done: false },
{ text: '构建一个应用', done: false }
];
vm.newTodo = { text: '' };
vm.addTodo = function() {
if (vm.newTodo.text.trim() !== '') {
vm.todos.push({
text: vm.newTodo.text,
done: false
});
vm.newTodo.text = '';
}
};
vm.removeTodo = function(index) {
vm.todos.splice(index, 1);
};
});
对应的 HTML 也要稍作修改:
ng-model="todo.newTodo.text"->ng-model="vm.newTodo.text"ng-click="todo.addTodo()"->ng-click="vm.addTodo()"ng-repeat="item in todo.todos"->ng-repeat="item in vm.todos"
步骤 3:运行与测试
直接在浏览器中打开 index.html 文件,你应该能看到一个可以交互的待办事项列表了,尝试添加、勾选和删除任务,感受双向数据绑定的魅力。
进阶主题
当你掌握了基础后,可以学习以下内容来构建更复杂的应用:
-
服务
- 用于封装可复用的业务逻辑,如数据访问、工具函数等,服务是单例的,在整个应用生命周期内只被创建一次。
- 内置服务:
$http(用于发起 AJAX 请求,与后端 API 交互),$location(操作浏览器 URL),$filter(格式化数据)。 - 自定义服务: 使用
app.service()或app.factory()创建你自己的服务。
-
路由
- 单页应用通常需要在不刷新页面的情况下切换视图。
ngRoute模块提供了路由功能。 - 你可以定义不同的 URL 路径(如
/home,/about),然后为每个路径指定一个对应的 HTML 模板和控制器。
- 单页应用通常需要在不刷新页面的情况下切换视图。
-
表单验证
- AngularJS 提供了强大的客户端表单验证功能,你可以通过给
input元素添加required,ng-minlength,ng-pattern等指令来进行验证,并在视图中轻松地显示错误信息。
- AngularJS 提供了强大的客户端表单验证功能,你可以通过给
-
过滤器
- 过滤器可以在视图中对数据进行格式化或转换,而无需修改控制器中的数据。
- 内置过滤器:
currency(货币格式),date(日期格式),filter(子数组过滤),uppercase(大写)。 - 使用方式:
{{ expression | filterName }},{{ 12345 | currency }}会显示$12,345.00。
重要提醒与最佳实践
-
AngularJS 已经过时
- 最大的提醒:AngularJS (v1.x) 已经被官方放弃,不再接收安全更新和新功能。强烈建议在新项目中不要使用 AngularJS。
- 选择现代框架:
- Angular: Google 推出的继任者,完全重写,使用 TypeScript,是一个功能完善的企业级框架。
- React: Facebook 出品,专注于构建 UI 库,生态极其庞大。
- Vue: 渐进式框架,易学易用,在国内非常流行。
-
性能考量
- 对于包含大量数据(如几千条)的列表,
ng-repeat的性能可能会成为瓶颈,可以考虑使用track by语句来优化,或者对于极大数据集,考虑虚拟滚动。
- 对于包含大量数据(如几千条)的列表,
-
代码组织
- 随着应用变大,将所有代码都放在一个
app.js文件中是不可行的,推荐按功能模块进行拆分,每个模块有自己的控制器、服务和指令文件。
- 随着应用变大,将所有代码都放在一个
-
安全
- AngularJS 在早期版本(<1.6)中存在一个严重的安全漏洞,称为 "模板注入",请确保你使用的版本是 6 或更高版本,并遵循 AngularJS 官方的安全最佳实践。
使用 AngularJS 开发网站的流程可以概括为:
- 搭建 HTML 结构,使用
ng-app定义应用根。 - 创建 AngularJS 模块,作为应用的容器。
- 定义控制器,在其中编写业务逻辑和数据。
- 在 HTML 视图中使用指令(如
ng-model,ng-repeat,ng-click)来绑定数据和响应用户操作。 - 利用服务(如
$http)与后端进行数据交互。 - 使用路由构建多视图的单页应用。
虽然 AngularJS 已不再是技术前沿,但它的许多思想(如数据绑定、依赖注入)深刻影响了后来的所有前端框架,理解 AngularJS 将是你前端技术演进道路上一个非常有价值的里程碑。
