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

Angularjs 服务、指令和模块之间的区别是什么?,angularjs,Angularjs,我已经读了很多文件,我越来越困惑。 我基本上搞不清两者之间的区别 服务 指示 模块 我看到很多定制组件。有时他们使用指令,有时使用服务。它总是从一个模块开始。有人能举例说明这三种类型之间的区别吗?将模块看作是连接许多其他东西的地方,如指令、服务、常量等。模块可以注入到其他模块中,从而实现高水平的重用 在编写angular应用程序时,您会有一个顶级模块,它是您的应用程序代码(没有模板) 服务主要是控制器之间通信的一种方式,但您可以将一个服务注入另一个服务。服务通常被用作访问数据存储的一种方式,

我已经读了很多文件,我越来越困惑。 我基本上搞不清两者之间的区别

  • 服务
  • 指示
  • 模块

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

将模块看作是连接许多其他东西的地方,如指令、服务、常量等。模块可以注入到其他模块中,从而实现高水平的重用

在编写angular应用程序时,您会有一个顶级模块,它是您的应用程序代码(没有模板)

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

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

指令也是执行DOM操作、捕获DOM事件等的地方。您不应该在控制器或服务中执行与DOM相关的操作。创建指令可能会变得相当复杂。首先,我建议大家先看看API,看看它能做什么,或者向Angular的Google Group寻求建议。

我自己的(大部分是文档、Google Group帖子等帖子中的片段):

模块

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

  • 是单例的,因此您定义的每个服务只有一个实例。作为单例,它们不受作用域的影响,因此可以由多个视图/控制器/指令/其他服务访问(与之共享)
  • 您可以(也可能应该)在以下情况下创建自定义服务:
    • 两个或更多的东西需要访问相同的数据(不要使用根范围),或者您只想整洁地封装数据
    • 您希望封装与web服务器的交互(在服务中扩展$resource或$http)
  • 内置服务以“$”开头
  • 要使用服务,依赖项注入需要依赖项(例如控制器、其他服务或指令)
指令(下面的一些条款基本上说的是同一件事,但我发现有时稍微不同的措辞会有很大帮助)

  • 负责在模型状态更改时更新DOM
  • 扩展HTML词汇表=教授HTML新技巧
    Angular附带了一组内置的指令(例如,ng-*stuff),这些指令对于构建web应用程序非常有用,但您可以添加自己的指令,以便将HTML转换为声明性领域特定语言(DSL)。例如,Angular主页演示“创建组件”上的和元素。
    • 不明显的内置指令(因为它们不以“ng”开头):a、form、input、script、select、textarea。在角度下,这些都比正常情况下做得更多
  • 指令允许您“组件化HTML”。指令通常比ng include更好。例如,当您开始编写大量以数据绑定为主的HTML时,请将该HTML重构为(可重用)指令
  • Angular编译器允许您将行为附加到任何HTML元素或属性,甚至创建具有自定义行为的新HTML元素或属性。Angular调用这些行为扩展指令。
    • 简而言之,指令只是一个函数,当Angular编译器在DOM中遇到它时执行
  • 指令是由属性、元素名、类名或注释中的名称触发的行为或DOM转换。指令是在(HTML)编译过程中遇到特定HTML构造时应触发的行为。指令可以放在元素名、属性、类名以及注释中。
    • 大多数指令仅限于属性。例如,双击仅使用自定义属性指令
  • 另见
在模块中定义和分组角度对象(依赖项注入对象)。
在服务中共享数据并包装web服务器交互。
扩展HTML并在指令中进行DOM操作。

并使控制器尽可能“薄”。

@Mark Rajcok-回答不错,我已经给了你+1,但最好澄清模块下的更多第3项,即“配置$injector”。人们了解注入服务,但这与模块有什么关系?@Leewitney,请参阅:“模块可以将其他模块列为其依赖项。取决于模块意味着需要在加载所需模块之前加载所需模块。换句话说,配置块