服务,指令和模块之间的区别

我是一个新手,了解基础知识,并尝试我的手在这个真棒框架。 我一直在阅读很多文档,越来越困惑。 我基本上无法弄清楚一个区别

  • 服务
  • 指示

我看到很多自定义组件。 有时他们使用指令,即时服务。 它始终始于一个模块。 有人可以用一个例子来解释这三种types之间的区别吗?

可以将模块看作是连接其他许多事物(如指令,服务,常量等)的地方。模块可以注入到其他模块中,从而实现高度的重用。

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

服务主要是一种在控制器之间进行通信的方式,但是您可以将一项服务注入另一项。 服务经常被用来作为到达你的数据存储的一种方式,人们将包装angular度的API,比如ngResource。 这个技术是有用的,因为它使得testing(特别是嘲笑)非常容易。 你可以有服务做其他的事情,如authentication,日志等

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

指令也是做DOM操作,捕捉DOM事件等的地方。你不应该在控制器或服务中做DOM相关的东西。 创build指令可能会非常复杂。 恕我直言,我build议首先看API的东西,可以做你正在寻找或询问Angular的谷歌集团的build议。

从我自己的个人笔记 (主要是文档,谷歌组post和SOpost):

模块

  • 提供了一种命名空间/组服务,指令,filter,configuration信息和初始化代码的方法
  • 帮助避免全局variables
  • 用于configuration$注入器,允许模块(或整个模块本身)定义的东西注入其他地方(dependency injection的东西)
  • Angular模块与CommonJS或Require.js无关。 与AMD或Require.js模块相反,Angular模块不会尝试解决脚本加载sorting或惰性脚本抓取的问题。 这些目标是正交的,两个模块系统可以并排居住并实现他们的目标(所以文档要求)。

服务

  • 是单身人士,所以每个你定义的服务只有一个实例。 作为单身人士,他们不受范围的影响,因此可以通过(共享)多个视图/控制器/指令/其他服务
  • 您可以(也可能应该)在创build自定义服务时
    • 两个或两个以上的东西需要访问相同的数据(不要使用根作用域),或者你只是想整齐地封装你的数据
    • 你想封装与Web服务器的交互(在你的服务中扩展$ resource或$ http)
  • 内置服务以“$”开头。
  • 要使用服务,依赖项(例如,在控制器或其他服务或指令上)需要dependency injection。

指令 (下面的一些条款基本上是一样的,但是我发现有时候略有不同的措辞会有很大帮助)

  • 负责在模型状态改变时更新DOM
  • 扩展HTML词汇=教新的HTML技巧。
    Angular带有一套内置的指令(例如,ng- * stuff),这些指令对于构buildWeb应用程序非常有用,但是您可以添加自己的内容,以便将HTML转换为声明式的特定于域的语言(DSL)。 例如,Angular主页演示“创build组件”中的<tabs>和<pane>元素。
    • 非明显的内置指令(因为它们不以“ng”开头):a,form,input,script,select,textarea。 在Angular下,这些都比平常做得更多!
  • 指令允许您“组件化HTML”。 指令通常比ng-include更好。 例如,当你开始写大量主要与数据绑定的HTML时,把HTML重构成(可重用的)指令。
  • Angular编译器允许您将行为附加到任何HTML元素或属性,甚至可以使用自定义行为创build新的HTML元素或属性。 Angular调用这些行为扩展指令
    • 当你把它搞糊涂了,一个指令只是一个函数,当Angular编译器在DOM中遇到它的时候,它就会执行。
  • 指令是一个行为或DOM转换,它是由一个属性,一个元素名称,一个类名或注释中的一个名称所引发的。 指令(Directive)是在(HTML)编译过程中遇到特定HTML结构时应该触发的行为。 指令可以放置在元素名称,属性,类名称以及注释中。
    • 大多数指令仅限于属性。 例如,DoubleClick仅使用自定义属性指令。
  • 另请参阅什么是angularjs指令?

在模块中定义和分组Angular事物(dependency injection的东西)。
共享数据并在服务中包装Web服务器交互。
扩展HTML并在指令中进行DOM操作。
并使控制器尽可能“瘦”。