受本文(Angular 2: The Difference Between Components and Directives) 的启发,我将尝试使用高层次的视角进行解释。它说的是 Angular 2,但在 AngularJs 上下文中也很有用。
指令
在计算机科学中有“Directive Pragma”的概念。根据维基百科:
“在计算机编程中,指令编译指示(来自“pragmatic”)是一种语言结构,它指定编译器(或汇编器或解释器)应如何处理其输入。指令不是语言本身的一部分”
这与 AngularJS 文档给出的描述非常吻合:
“在高层次上,指令是 DOM 元素(例如属性、元素名称、注释或 CSS 类)上的标记,它告诉 AngularJS 的 HTML 编译器($compile)将指定的行为附加到该 DOM 元素(例如通过事件监听器),甚至转换 DOM 元素及其子元素。”
所以,指令的基本作用是向(Angular)编译器发出指令,以改变 DOM 或其行为。
组件
AngularJS 中的组件是一个特殊的指令;正如 AngularJS 文档所述,他们试图模仿 Web 组件:
在 AngularJS 中,组件是一种特殊的指令,它使用更简单的配置,适用于基于组件的应用程序结构。
这使得以类似于使用 Web 组件或使用新的 Angular 应用程序架构风格的方式编写应用程序变得更加容易。
什么时候用什么?
就我个人而言,除非有充分的理由不使用,否则我会使用组件。
AngularJS 组件文档中给出了其中一些原因:
- 用于需要在编译和预链接函数中执行操作的指令,因为它们不可用
- 当您需要优先级、终端、多元素等高级指令定义选项时
- 当您需要由属性或 CSS 类而不是元素触发的指令时
另一种说法:
指令是我们可以将行为附加到 DOM 中的元素的机制。
组件是一种特定类型的指令,它可以利用 Web 组件功能 - 封装的、可重用的元素在我们的整个应用程序中可用。
可能的结论
一旦您了解组件是指令,我认为问题并不是那么好。这两个概念并不是试图解决同一个问题。组件是一个扩展,它允许使用指令来构建基于组件的 Web 应用程序。
更深入
Todd Motto 在这个小GIST 中分享他对这个主题的了解。
指令装饰 DOM,添加行为并扩展现有 DOM。使用 .component() 时创建 DOM,使用 .directive() 时装饰 DOM,这就是心态