Angular中的@Component和@Directive有什么区别? 它们似乎都做同样的任务,具有相同的属性。

用例是什么,什么时候选择一个而不是另一个?


当前回答

指令:

指令是向元素添加额外行为的类。

不同类型的指令有:

组件:这些指令包含模板 属性指令:这些类型的指令改变元素、组件、其他指令的视图或行为 结构性指令:这些指令通过添加或删除DOM元素来改变DOM布局。

其他回答

组件是一个带有模板的指令,@Component装饰器实际上是一个@Directive装饰器,它扩展了面向模板的特性。

在Angular 2及以上版本中,“所有东西都是组件。”组件是 我们在页面上构建和指定元素和逻辑的主要方式, 通过添加功能的自定义元素和属性 我们现有的组件。

http://learnangular2.com/components/

但是在Angular2+中指令是做什么的呢?

属性指令将行为附加到元素上。 Angular中有三种指令: 组件——带有模板的指令。 结构性directives-change 通过添加和删除DOM元素来调整DOM布局。 属性指令——改变元素的外观或行为, 组件或另一个指令。

https://angular.io/docs/ts/latest/guide/attribute-directives.html

在Angular2和以上版本中,指令是为元素和组件添加功能的属性。

看看下面Angular.io的示例:

import { Directive, ElementRef, Input } from '@angular/core';

@Directive({ selector: '[myHighlight]' })
export class HighlightDirective {
    constructor(el: ElementRef) {
       el.nativeElement.style.backgroundColor = 'yellow';
    }
}

它会扩展你的组件和HTML元素,添加黄色背景,你可以像下面这样使用:

<p myHighlight>Highlight me!</p>

但是组件将创建具有所有功能的完整元素,如下所示:

import { Component } from '@angular/core';

@Component({
  selector: 'my-component',
  template: `
    <div>Hello my name is {{name}}. 
      <button (click)="sayMyName()">Say my name</button>
    </div>
   `
})
export class MyComponent {
  name: string;
  constructor() {
    this.name = 'Alireza'
  }
  sayMyName() {
    console.log('My name is', this.name)
  }
}

你可以这样使用它:

<my-component></my-component>

当我们在HTML中使用标记时,该组件将被创建,构造函数将被调用并呈现。

指令:

指令是向元素添加额外行为的类。

不同类型的指令有:

组件:这些指令包含模板 属性指令:这些类型的指令改变元素、组件、其他指令的视图或行为 结构性指令:这些指令通过添加或删除DOM元素来改变DOM布局。

组件是一个单独的单元,它封装了视图和逻辑,而指令是用来增强组件或dom元素的行为的,它没有任何模板。

组件扩展指令,因此每个组件都是指令。

组件和指令都可以有生命周期钩子、输入、输出、提供程序和查询。 组件还可以有视图提供者、changedetectionstrategy、 模板、样式和视图封装。

我们可以使用组件来构建功能元素和指令 为元素创建自定义。

组件

组件是Angular应用中最基本的UI构建块。Angular应用中包含一个Angular组件树。我们在Angular中的应用是构建在一个组件树上的。每个组件都应该有自己的模板、样式、生命周期、选择器等等。因此,每个组件都有自己的结构,你可以将它们视为一个独立的小型web应用程序,有自己的模板和逻辑,并有可能与其他组件通信和一起使用。

Component的.ts文件示例:

import { Component } from '@angular/core';

@Component({
    // component attributes
    selector: 'app-training',
    templateUrl: './app-training.component.html',
    styleUrls: ['./app-training.component.less']
})

export class AppTrainingComponent {
    title = 'my-app-training';
}

以及它的。/app.component.html模板视图:

Hello {{title}}

然后你可以在其他组件中呈现AppTrainingComponent模板及其逻辑(在将其添加到模块后)

<div>
   <app-training></app-training>
</div>

结果就是

<div>
   my-app-training
</div>

as AppTrainingComponent在这里被渲染

有关组件的详细信息

指令

指令更改现有DOM元素的外观或行为。例如[ngStyle]是一个指令。指令可以扩展组件(可以在组件内部使用),但它们不能构建整个应用程序。假设它们只支持组件。它们没有自己的模板(当然,您可以使用它们来操作模板)。

示例指令:

@Directive({
  selector: '[appHighlight]'
})
export class HighlightDirective {

  constructor(private el: ElementRef) { }

  @Input('appHighlight') highlightColor: string;

  @HostListener('mouseenter') onMouseEnter() {
    this.highlight(this.highlightColor || 'red');
  }

  private highlight(color: string) {
    this.el.nativeElement.style.backgroundColor = color;
  }
}

及其用法:

<p [appHighlight]="color" [otherPar]="someValue">Highlight me!</p>

查看更多关于指令的信息