服务、指令和模块之间的区别是什么?

我看了很多文件,我越来越糊涂了。 我基本上搞不清楚

  • 服务
  • 指令
  • 模组

我看到了很多定制组件。有时他们使用指令,有时使用服务。它总是从一个模块开始。有人能举个例子解释一下这三种类型之间的区别吗?

69992 次浏览

可以将模块看作是连接许多其他事物的地方,例如指令、服务、常量等。模块可以被注入到其他模块中,从而提供高度的重用性。

当编写一个有角度的应用程序,你会有一个顶级模块,这是你的应用程序代码(没有模板)。

服务主要是控制器之间通信的一种方式,但是您可以将一个服务注入到另一个服务中。服务通常被用作访问数据存储的一种方式,人们会封装有角度的 API,比如 ngResource。这种技术非常有用,因为它使测试(特别是模拟)非常容易。您可以使用服务来完成其他事情,比如身份验证、日志记录等等。

指令用于创建小部件或包装现有的东西,如 jquery 插件。包装现有的插件可能是一个挑战,你这样做的原因是建立一个双向的数据绑定之间的插件和角度。如果不需要双向数据绑定,那么就不需要包装它们。

指令也是进行 DOM 操作、捕获 DOM 事件等的地方。您不应该在控制器或服务中做与 DOM 相关的事情。创建指令可能会非常复杂。恕我直言,我建议您首先查看 API,寻找能够实现您所寻找的功能的东西,或者向 Angular 的 Google Group 寻求建议。

来自我自己的 私人笔记(大部分是来自文档、 google 组文章和 SO 文章的片段) :

模组

  • 提供命名空间/组服务、指令、过滤器、配置信息和初始化代码的方法
  • 有助于避免全局变量
  • 用于配置 $注入器,允许模块(或整个模块本身)定义的内容注入到其他地方(依赖注入内容)
  • 角度模块与 CommonJS 或 Requre.js 无关。与 AMD 或 Requre.js 模块不同,Angular 模块不会尝试解决脚本加载顺序或延迟脚本获取的问题。这些目标是正交的,两个模块系统可以并存并实现它们的目标(文档声称如此)。

服务

  • 是单例的,所以您定义的每个服务只有一个实例。作为单例,它们不受作用域的影响,因此可以通过(与)多个视图/控制器/指令/其他服务进行访问
  • 您可以(也许应该)在以下情况下创建自定义服务:
    • 两个或更多的东西需要访问相同的数据(不要使用 root 作用域) ,或者您只是想整齐地封装您的数据
    • 您希望封装与 Web 服务器的交互(在服务中扩展 $resource 或 $http)
  • 内置服务以“ $”开头。
  • 要使用服务,需要依赖依赖注入(例如,依赖控制器、另一个服务或指令)。

指令 (下面的一些条目基本上说的是同一件事,但我发现有时稍微不同的措辞会有很大帮助)

  • 负责在模型状态发生变化时更新 DOM
  • 扩展 HTML 词汇表 = 教授 HTML 新技巧。Angular 附带了一组内置的指令(例如,ng-* stuff) ,这些指令对于构建 web 应用程序很有用,但是你也可以添加自己的指令,这样 HTML 就可以变成一种声明性的领域特定语言(DSL)。例如,在 Angular 主页演示“创建组件”中的 < tab > 和 < panel > 元素。
    • 不明显的内置指令(因为它们不以“ ng”开头) : a、 form、 input、 script、 select、 textarea。在角度下,这些都比正常做得更多!
  • 指令允许您“组件化 HTML”。指令通常比 n- 包含更好。例如,当您开始编写大量以数据绑定为主的 HTML 时,请将该 HTML 重构为(可重用的)指令。
  • Angular 编译器允许您将行为附加到任何 HTML 元素或属性,甚至创建具有自定义行为的新 HTML 元素或属性。Angular 将这些行为扩展称为 指令
    • 当你把它全部归结起来,一个指令只是一个函数,当 Angular 编译器在 DOM 中遇到它时执行。
  • 指令是由属性、元素名、类名或注释中的名称触发的行为或 DOM 转换。指令是在(HTML)编译过程中遇到特定 HTML 构造时应触发的行为。指令可以放在元素名称、属性、类名称以及注释中。
    • 大多数指令仅限于属性。例如,DoubleClick 只使用自定义属性指令。
  • 另见 什么是 angularjs 指令?

在模块中定义和分组有角度的东西(依赖注入)。
在服务中共享数据和包装 Web 服务器交互。
扩展 HTML 并在指令中执行 DOM 操作。
并使控制器尽可能“瘦”。