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

var*_*run 148 angularjs

我一直在阅读很多文档,而且我越来越困惑了.我基本上无法弄清楚a之间的区别

  • 服务
  • 指示

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

Mar*_*cok 230

从我自己的个人笔记(主要是来自文档的片段,谷歌小组帖子和SO帖子):

模块

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

服务

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

指令(下面的一些项目基本上是相同的,但我发现有时候略有不同的措辞有很多帮助)

  • 负责在模型状态发生变化时更新DOM
  • 扩展HTML词汇=教HTML新技巧.
    Angular附带了一组内置指令(例如,ng-*stuff),这些指令对于构建Web应用程序很有用,但您可以添加自己的指令,以便将HTML转换为声明性域特定语言(DSL).例如,Angular主页上的<tabs>和<pane>元素演示"创建组件".
    • 非显而易见的内置指令(因为它们不以"ng"开头):a,form,input,script,select,textarea.在Angular下,这些都比正常更多!
  • 指令允许您"组件化HTML".指令通常比ng-include更好.例如,当您开始编写大量主要是数据绑定的HTML时,将HTML重构为(可重用)指令.
  • Angular编译器允许您将行为附加到任何HTML元素或属性,甚至可以使用自定义行为创建新的HTML元素或属性.Angular调用这些行为扩展指令.
    • 当你把它全部烧掉时,指令只是一个在Angular编译器在DOM中遇到它时执行的函数.
  • 指令是一种行为或DOM转换,它由注释中存在的属性,元素名称,类名或名称触发.指令是在(HTML)编译过程中遇到特定HTML构造时应触发的行为.指令可以放在元素名称,属性,类名以及注释中.
    • 大多数指令仅限于属性.例如,DoubleClick仅使用自定义属性指令.
  • 另请参见什么是angularjs指令?

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

  • @LeeWhitney,请参阅http://docs.angularjs.org/guide/module#dependencies:"模块可以将其他模块列为其依赖项.根据模块的含义,需要在加载需求模块之前加载所需的模块.换句话说,所需模块的配置块在需求模块的配置块之前执行." (2认同)

Dan*_*yon 121

可以将模块视为连接许多其他内容的地方,例如指令,服务,常量等.可以将模块注入到其他模块中,从而为您提供高水平的重用.

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

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

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

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