服务,指令和模块之间有什么区别?


151

我读了很多文档,而且越来越困惑。我基本上不知道两者之间的区别

  • 服务
  • 指示
  • 模组

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

Answers:


123

可以将模块视为连接其他许多事物的地方,例如指令,服务,常量等。模块可以注入到其他模块中,从而使您可以高度重用。

编写有角度的应用程序时,您将拥有一个顶级模块,即您的应用程序代码(没有模板)。

服务主要是控制器之间进行通信的一种方式,但是您可以将一个服务注入另一个服务。服务通常被用作访问数据存储的一种方式,人们会包装Angular API,例如ngResource。该技术很有用,因为它使测试(尤其是模拟)变得非常容易。您可以使用服务来执行其他操作,例如身份验证,日志记录等。

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

指令也是进行DOM操作,捕获DOM事件等的地方。您不应在控制器或服务中进行与DOM相关的工作。创建指令可能会变得非常复杂。恕我直言,我建议您首先查看可以满足您需求的API,或者向Angular的Google小组寻求建议。


234

从我自己的个人笔记(主要是文档,Google网上论坛帖子和SO帖子的摘要)中:

模组

  • 提供名称空间/组服务,指令,过滤器,配置信息和初始化代码的方法
  • 帮助避免全局变量
  • 用于配置$ injector,允许将模块(或整个模块本身)定义的内容注入其他地方(Dependency Injection的东西)
  • Angular模块与CommonJS或Require.js不相关。与AMD或Require.js模块相对,Angular模块不会尝试解决脚本加载顺序或延迟脚本获取的问题。这些目标是正交的,并且两个模块系统都可以并存并实现其目标(因此,文档声称)。

服务

  • 是单例,因此您定义的每个服务只有一个实例。作为单例,它们不受范围的影响,因此可以被(与之共享)多个视图/控制器/指令/其他服务
  • 您可以(可能应该)在以下情况下创建自定义服务
    • 两件或更多件事情需要访问同一数据(不使用根范围),或者您只想整齐地封装数据
    • 您想封装与Web服务器的交互(在服务中扩展$ resource或$ http)
  • 内置服务以“ $”开头。
  • 为了使用服务,需要对依赖项进行依赖项注入(例如,依赖于控制器,另一个服务或指令)。

指令(以下某些项目在本质上是相同的,但我发现有时措辞略有不同会有所帮助)

  • 当模型状态改变时负责更新DOM
  • 扩展HTML词汇=教HTML新技巧。
    Angular带有一组内置指令(例如ng- *东西),这些指令对于构建Web应用程序很有用,但是您可以添加自己的指令,以便HTML可以转换为声明性的特定领域语言(DSL)。例如,Angular主页演示“创建组件”中的<tabs>和<pane>元素。
    • 非显而易见的内置指令(因为它们不是以“ ng”开头):a,表单,输入,脚本,选择,文本区域。在Angular下,这些功能比正常情况下要多!
  • 指令允许您“将HTML组件化”。指令通常比ng-include更好。例如,当您开始编写大量主要具有数据绑定功能的HTML时,请将HTML重构为(可重用)指令。
  • Angular编译器允许您将行为附加到任何HTML元素或属性,甚至可以创建具有自定义行为的新HTML元素或属性。Angular调用这些行为扩展指令
    • 当您将其全部煮沸时,指令只是当Angular编译器在DOM中遇到它时执行的函数。
  • 指令是一种行为或DOM转换,由属性,元素名称,类名称或注释中的名称的存在触发。指令是一种行为,当在(HTML)编译过程中遇到特定的HTML构造时应触发该行为。指令可以放在元素名称,属性,类名称以及注释中。
    • 大多数指令仅限于属性。例如,DoubleClick仅使用自定义属性指令。
  • 另请参阅什么是angularjs指令?

在模块中定义和分组Angular事物(依赖注入事物)。
共享数据并将Web服务器交互包装在服务中。
扩展HTML并在指令中执行DOM操作。
并使控制器尽可能“薄”。


1
@Mark Rajcok-很好的答案,我已经给您+1了,但是在模块下阐明更多项目3,即“配置$ injector”,人们会理解注入服务,但这与模块有什么关系呢?
whitneyland

2
@LeeWhitney,请参阅docs.angularjs.org/guide/module#dependencies:“模块可以列出其他模块作为它们的依赖关系。根据模块的不同,意味着需要在加载需求模块之前先加载需求模块。换句话说,配置所需模块的块在所需模块的配置块之前执行。”
Mark Rajcok

@MarkRajcok链接现在已断开
Michael Smith,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.