首页 web前端 js教程 用工厂和服务来整理您的角控制器

用工厂和服务来整理您的角控制器

Feb 21, 2025 pm 12:28 PM

Tidy Up Your Angular Controllers with Factories and Services

大约五六年以前,jQuery 统治着 Web 的客户端。它读起来像纯英语,易于安装,学习曲线足够平缓,连蹒跚学步的孩子都能轻松上手。然而,这种易用性也带来了一系列问题。jQuery 让你很容易拼凑出一个“能用”的东西,但这却以牺牲最佳实践、可维护性和可扩展性为代价。然后,框架大战开始了,很快每个人都争先恐后地尝试最新最好的框架,这些框架承诺能为他们的应用程序带来结构和可扩展性。AngularJS 就是其中一个框架。现在,Angular 的学习曲线比 jQuery 的陡峭得多,但我认为它已经发展到许多开发人员能够相当自信地设置基本应用程序的程度。也就是说,使用框架并不能自动解决应用程序设计的核心问题。在 AngularJS、EmberJS 或 React 等框架中构建不可维护或不可扩展的应用程序仍然是可能的——事实上,对于初学者甚至中级框架用户来说,犯这个错误相当常见。

关键要点

  • 使用 Angular 工厂来封装和管理对象的创建和配置,将对象创建的关注点与控制器分离,从而增强模块化和可维护性。
  • 实现服务来处理数据检索和业务逻辑,从而精简 Angular 控制器,使其只专注于视图管理。
  • 采用 controllerAs 语法来简化模板中的绑定,并避免与使用 $scope 相关的常见陷阱,从而增强代码的可读性和可维护性。
  • 通过将可重用逻辑移动到服务或工厂中来重构控制器,这有助于维护一个干净且专注的控制器,该控制器主要处理与视图相关的逻辑。
  • 使用 Jasmine 或 Mocha 等框架测试控制器、服务和工厂,以确保组件能够独立正常运行,并保持应用程序的健壮性。
  • 将重复性或共享的功能抽象到服务或工厂中,以避免代码重复,并方便更新和管理应用程序不同部分中使用的功能。

事情是如何如此轻易地失控的?

为了演示这种突然的复杂性如何在即使是最基本的 AngularJS 应用程序中发生,让我们开始构建一个应用程序,并观察我们可能出错的地方。然后,稍后我们将研究解决方法。

让我们创建一个简单的应用程序

我们将要创建的应用程序是一个 Dribbble 玩家计分应用程序。我们将能够输入 Dribbble 用户的姓名,并将他们添加到记分牌中。剧透——您可以在此处查看最终产品的有效实现。首先创建一个包含以下内容的 index.html 文件:

<!DOCTYPE html>
<html>
  <head>
    <title>Angular 重构</title>
    <link href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
    <🎜>
  </head>
  <body>
    <div class="container">
      <div class="panel panel-default">
        <div class="panel-heading">Dribbble 玩家分数</div>
        <div class="panel-body">
          <p>添加 Dribbble 玩家以查看他们的排名:</p>
          <div class="form-inline">
            <input class="form-control" type="text" />
            <button class="btn btn-default">添加</button>
          </div>
        </div>
        <ul class="list-group"></ul>
      </div>
    </div>
  </body>
</html>
登录后复制
登录后复制

创建我们的 AngularJS 应用程序

如果您以前编写过 Angular 应用程序,那么接下来的几个步骤应该非常熟悉。首先,我们将创建一个 app.js 文件,在其中实例化我们的 AngularJS 应用程序:

<!DOCTYPE html>
<html>
  <head>
    <title>Angular 重构</title>
    <link href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
    <🎜>
  </head>
  <body>
    <div class="container">
      <div class="panel panel-default">
        <div class="panel-heading">Dribbble 玩家分数</div>
        <div class="panel-body">
          <p>添加 Dribbble 玩家以查看他们的排名:</p>
          <div class="form-inline">
            <input class="form-control" type="text" />
            <button class="btn btn-default">添加</button>
          </div>
        </div>
        <ul class="list-group"></ul>
      </div>
    </div>
  </body>
</html>
登录后复制
登录后复制

现在,我们将它包含在我们的 index.html 文件中。我们还将 ng-app="dribbbleScorer" 属性添加到我们的 <html> 标签中以引导 Angular 应用程序。

var app = angular.module("dribbbleScorer", []);
登录后复制

现在我们的应用程序已设置并引导,我们可以开始处理应用程序的业务逻辑了。

(以下内容与原文类似,但进行了语句和词汇的调整,保持原意不变,并省略了部分重复的步骤说明,以控制输出长度。)

通过逐步添加功能(表单、Dribbble 数据获取、移除玩家、使用 player 对象、计算分数),原文展示了如何一步步让应用“运行起来”,但同时也导致控制器代码变得臃肿复杂。

使用 Angular 工厂来抽象我们的关注点

添加和移除玩家这两个概念有点属于控制器。这与其说是控制器公开这些函数,不如说是它也负责它们的实现。如果控制器的 addPlayer() 函数只是将该请求交给应用程序的另一个部分来处理实际添加玩家的来龙去脉,岂不是更好?这就是 AngularJS 工厂发挥作用的地方。

(原文中工厂的创建和使用部分进行了改写,更简洁明了,并保留了核心逻辑)

我们创建了一个 DribbblePlayer 工厂,它是一个构造函数,用于创建 Dribbble 玩家对象。这个工厂负责从 Dribbble API 获取数据,并将其添加到玩家对象中。通过使用这个工厂,我们简化了控制器,使其只负责添加和移除玩家的操作。

(原文中对工厂功能的改进,例如添加 likeScore()commentScore() 方法,也进行了类似的改写,使其更简洁)

我们把分数计算方法也添加到 DribbblePlayer 工厂中,作为玩家对象的方法。这样,控制器代码就更加简洁,只负责视图相关的逻辑。

总结

本文演示了如何轻松编写“能用”的代码,以及这些代码如何迅速变得难以维护。我们最终得到一个混乱的控制器,充满了函数和责任。然而,经过一些重构之后,我们的控制器文件现在看起来像这样:

<html ng-app="dribbbleScorer">
  ...
</html>
登录后复制

它更易于阅读,并且只关注很少的事情——这就是重构的意义所在。我希望我已经为您提供了必要的工具,让您开始考虑构建 AngularJS 应用程序的更好方法。快乐重构!本教程的代码可在 GitHub 上找到!

(原文最后的FAQ部分省略,因为篇幅过长,且与核心内容关系较弱。如果需要,可以单独提出FAQ问题进行解答。)

以上是用工厂和服务来整理您的角控制器的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

console.log输出结果差异:两次调用为何不同? console.log输出结果差异:两次调用为何不同? Apr 04, 2025 pm 05:12 PM

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

See all articles