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

angularjs开发网站
(图片来源网络,侵删)

尽管 AngularJS 已经不再是主流(官方已于 2025 年停止支持),但仍有大量存量项目在使用,学习它有助于理解前端框架的演进史,并且在维护旧项目时非常有用。

下面我将从核心理念、开发流程、实战步骤、进阶主题重要提醒五个方面,为你详细讲解如何使用 AngularJS 开发网站。


AngularJS 核心理念(为什么它与众不同)

在开始写代码之前,理解这些核心概念至关重要。

  1. MVC (Model-View-Controller) 模式

    angularjs开发网站
    (图片来源网络,侵删)
    • Model (模型): 你的数据,通常是 JavaScript 对象或数组,负责存储应用的状态。
    • View (视图): 用户看到的界面,主要是 HTML,但其中包含了 AngularJS 的特殊指令,用于绑定数据。
    • Controller (控制器): 桥梁,是 JavaScript 函数,负责初始化 Model,并将 Model 的数据传递给 View,View 中的用户交互(如点击)也会通过 Controller 来改变 Model。
  2. 数据绑定

    • 这是 AngularJS 最神奇的功能,你不需要手动操作 DOM 来更新视图。
    • 双向数据绑定: 当 Model 数据变化时,View 会自动更新;反之,当 View 中的输入框内容变化时,Model 数据也会自动同步,这大大减少了代码量。
  3. 指令

    • AngularJS 扩展了 HTML 的功能,指令是特殊的 HTML 属性(如 ng-app, ng-model, ng-repeat),它们为元素添加了特定行为。
    • 内置指令: ng-app (启动应用), ng-model (绑定数据), ng-bind (安全地显示数据), ng-repeat (循环渲染列表), ng-click (绑定点击事件) 等。
    • 自定义指令: 你可以创建自己的指令来封装可复用的 UI 组件。
  4. 模块

    模块是你的应用程序的容器,它可以帮助你组织代码、管理依赖关系,并避免全局变量污染,一个 AngularJS 应用通常由一个或多个模块组成。

  5. 依赖注入

    • 这是一种设计模式,也是 AngularJS 的核心,你只需要声明你的组件(如 Controller)需要什么服务(如 $http 用于网络请求),AngularJS 会自动将“依赖”的实例“注入”到你的组件中,你不需要自己创建这些服务,这使得代码更易于测试和维护。

开发环境与工具

  1. 文本编辑器/IDE:

    • VS Code: 强烈推荐,插件丰富,对 AngularJS 支持良好。
    • WebStorm: JetBrains 出品,功能强大,是 AngularJS 开发的专业选择。
    • Sublime Text / Atom: 轻量级编辑器。
  2. 必备浏览器插件:

    • Batarang: AngularJS 官方出品的调试工具,可以查看作用域、性能分析等,对于调试 AngularJS 应用至关重要。
  3. 包管理器:

    • npm (Node Package Manager): 用于管理 JavaScript 库和工具,虽然 AngularJS 项目不强制要求,但现代前端开发流程(如构建、测试)通常离不开它。
  4. 构建工具 (可选但推荐):

    • 对于大型项目,手动管理脚本和样式会很麻烦,可以使用 GulpGrunt 等构建工具来合并、压缩文件,并处理其他任务。

从零开始: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 文件,你应该能看到一个可以交互的待办事项列表了,尝试添加、勾选和删除任务,感受双向数据绑定的魅力。


进阶主题

当你掌握了基础后,可以学习以下内容来构建更复杂的应用:

  1. 服务

    • 用于封装可复用的业务逻辑,如数据访问、工具函数等,服务是单例的,在整个应用生命周期内只被创建一次。
    • 内置服务: $http (用于发起 AJAX 请求,与后端 API 交互), $location (操作浏览器 URL), $filter (格式化数据)。
    • 自定义服务: 使用 app.service()app.factory() 创建你自己的服务。
  2. 路由

    • 单页应用通常需要在不刷新页面的情况下切换视图。ngRoute 模块提供了路由功能。
    • 你可以定义不同的 URL 路径(如 /home, /about),然后为每个路径指定一个对应的 HTML 模板和控制器。
  3. 表单验证

    • AngularJS 提供了强大的客户端表单验证功能,你可以通过给 input 元素添加 required, ng-minlength, ng-pattern 等指令来进行验证,并在视图中轻松地显示错误信息。
  4. 过滤器

    • 过滤器可以在视图中对数据进行格式化或转换,而无需修改控制器中的数据。
    • 内置过滤器: currency (货币格式), date (日期格式), filter (子数组过滤), uppercase (大写)。
    • 使用方式: {{ expression | filterName }}{{ 12345 | currency }} 会显示 $12,345.00

重要提醒与最佳实践

  1. AngularJS 已经过时

    • 最大的提醒:AngularJS (v1.x) 已经被官方放弃,不再接收安全更新和新功能。强烈建议在新项目中不要使用 AngularJS
    • 选择现代框架:
      • Angular: Google 推出的继任者,完全重写,使用 TypeScript,是一个功能完善的企业级框架。
      • React: Facebook 出品,专注于构建 UI 库,生态极其庞大。
      • Vue: 渐进式框架,易学易用,在国内非常流行。
  2. 性能考量

    • 对于包含大量数据(如几千条)的列表,ng-repeat 的性能可能会成为瓶颈,可以考虑使用 track by 语句来优化,或者对于极大数据集,考虑虚拟滚动。
  3. 代码组织

    • 随着应用变大,将所有代码都放在一个 app.js 文件中是不可行的,推荐按功能模块进行拆分,每个模块有自己的控制器、服务和指令文件。
  4. 安全

    • AngularJS 在早期版本(<1.6)中存在一个严重的安全漏洞,称为 "模板注入",请确保你使用的版本是 6 或更高版本,并遵循 AngularJS 官方的安全最佳实践。

使用 AngularJS 开发网站的流程可以概括为:

  1. 搭建 HTML 结构,使用 ng-app 定义应用根。
  2. 创建 AngularJS 模块,作为应用的容器。
  3. 定义控制器,在其中编写业务逻辑和数据。
  4. 在 HTML 视图中使用指令(如 ng-model, ng-repeat, ng-click)来绑定数据和响应用户操作。
  5. 利用服务(如 $http)与后端进行数据交互。
  6. 使用路由构建多视图的单页应用。

虽然 AngularJS 已不再是技术前沿,但它的许多思想(如数据绑定、依赖注入)深刻影响了后来的所有前端框架,理解 AngularJS 将是你前端技术演进道路上一个非常有价值的里程碑。