AngularJS 1.5中组件和指令之间的主要区别是什么?

时间:2016-07-13 04:26:14

标签: angularjs angular-directive

我发现很难理解组件和指令之间的真正区别。我现在明白组件是一个更容易的概念。

因此,考虑到这一点,在使用AngularJS 1.5时有没有理由继续使用指令?

也许我在这里错过了真实的上下文,但似乎组件提供了一个更简单的API。

那么我还有什么理由继续使用指令?

Angular 2指出一切都是一个组件,因此努力从1.5迁移到2,只使用未来的组件是否有意义?

过去我曾使用指令来创建例如自动查找文本框,没有理由我现在不应该在组件内执行此操作吗?然后我可以在我创建的其他组件中重用这个组件吗?

3 个答案:

答案 0 :(得分:33)

只需复制角度文档,因为它们以我能想到的最好方式。

  

了解组件

     

在Angular中,Component是一种使用a的特殊指令   更简单的配置,适用于基于组件   申请结构。

     

这使得以类似于使用的方式编写应用程序变得更容易   Web组件或使用Angular 2的应用程序架构风格。

     

组件的优点:

     
      
  • 比plain指令更简单的配置
  •   
  • 宣传理智默认值和最佳做法
  •   
  • 针对基于组件的架构进行了优化
  •   
  • 编写组件指令将使其更容易升级到Angular 2
  •   
     

何时不使用组件:

     
      
  • 用于依赖于DOM操作,添加事件侦听器等的指令,因为编译和链接函数是   不可用
  •   
  • 当您需要高级指令定义选项时,例如priority,terminal,multi-element
  •   
  • 当您需要由属性或CSS类而不是元素
  • 触发的指令时   

更多阅读:https://docs.angularjs.org/guide/component

答案 1 :(得分:3)

组件基本上只是一种专为基于组件的体系结构而设计的新型指令。在很多方面,组件的功能受到更多限制,而是鼓励更好的约定和设计,从而实现更可维护和可重用的代码。

例如,组件强制隔离范围并强烈鼓励单向绑定。为什么这很重要?因为这样可以更好地封装组件,并且不鼓励您创建与父元素或范围紧密耦合的组件。这意味着您以这样一种方式编写组件,使您在未经修改的情况下更有可能在未来重用(而不是像许多人那样倾向于重复使用复制和粘贴)。这也可以更轻松地跟踪和控制数据的交互和更改。

组件仍然可以与父作用域交互,但这是通过绑定到组件事件的回调来完成的。同样,这种限制迫使或至少强烈鼓励软件设计,使重用组件更容易,并掌握组件与父范围和外部元素的交互方式。

可以使用AngularJS模块的.component()方法注册组件(由angular.module()返回)。该方法有两个参数:

1)Component的名称(作为字符串)。

2)Component配置对象。 (注意,与.directive()方法不同,此方法不采用工厂函数。)

// for directive

module.directive(name,fn);

// for component

module.component(name,options);

答案 2 :(得分:0)

在本文(Angular 2: The Difference Between Components and Directives)的启发下,我将尝试从较高的角度进行解释。它表示Angular 2,但在AngularJs上下文中也很有用。

指令

在计算机科学中,存在“指令语用说明”的概念。根据维基百科:

  

“在计算机编程中,指令编译指示(来自“ pragmatic”)是一种语言构造,用于指定编译器(或汇编器或解释器)应如何处理其输入。指令不是语言本身的一部分”

这与AngularJS文档给出的描述非常吻合:

  

“高级别上,指令是DOM元素(例如属性,元素名称,注释或CSS类)上的标记,它们告诉AngularJS的HTML编译器($ compile)将指定的行为附加到该DOM元素(例如通过事件侦听器),甚至可以转换DOM元素及其子元素。”

因此,指令的基本作用是为(Angular)编译器提供指令,以更改DOM或其​​行为。

组件

AngularJS中的组件是一个特殊的指令。他们尝试模仿Web组件,如AngularJS文档所述:

  

在AngularJS中,组件是一种特殊的指令,它使用更简单的配置,适用于基于组件的应用程序结构。

这使编写应用程序变得更容易,类似于使用Web组件或使用新的Angular风格的应用程序体系结构。

何时使用什么?

我个人使用组件,除非有充分的理由不这样做。

其中一些原因在AngularJS文档中针对组件给出了

  • 用于需要在编译和预链接功能中执行操作的指令,因为它们不可用
  • 当您需要高级指令定义选项(例如优先级,终端,多元素)时
  • 当您需要由属性或CSS类而不是元素触发的指令时

另一种表达方式:

伪指令是我们可以将行为附加到DOM中的元素的机制。

组件是一种特定类型的指令,它使得可以利用Web组件功能-在我们的应用程序中可用的封装的可重用元素。

可能的结论

我认为,一旦您了解了组件是指令,问题就不会那么好了。这两个概念并不是要解决相同的问题。组件是一种扩展,它允许使用指令来构建基于组件的Web应用程序。

更深入

托德·莫托(Todd Motto)在这个小小的GIST中分享了他对该主题的了解。

  

指令装饰DOM,增加行为并扩展现有DOM。当您使用.component()时,您将创建DOM,而当您使用.directive()时,您将装饰DOM,这就是心态