@Directive v / s @Component in Angular

308

В чем разница между @Component и @Directive в Angular? Оба они, похоже, выполняют одну и ту же задачу и имеют одинаковые атрибуты.

Каковы варианты использования и когда вы предпочитаете друг друга?

  • 11
    Компонент - это директива с шаблоном, а декоратор @Component самом деле является декоратором @Directive расширенным с помощью шаблонно-ориентированных функций - source .
  • 2
    Директива против Компонента - это новая Услуга против Фабрики. Путаница также усиливается, потому что, когда на самом деле требуются другие компоненты из определения компонента, вы указываете их в массиве directives ... возможно, приведенный ниже комментарий Лиды Венг помогает немного прояснить, что компонент "это на самом деле расширенная" Директива ""
Показать ещё 1 комментарий
Теги:
angular

7 ответов

427
Лучший ответ

Для @Component требуется представление, тогда как @Directive этого не делает.

Директивы

Я сравниваю @Directive с директивой Angular 1.0 с опцией restrict: 'A' (Директивы не ограничиваются использованием атрибутов.) Директивы добавляют поведение к существующему элементу DOM или к существующему компонентный экземпляр. Одним из примеров использования для директивы является запись клика по элементу.

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

@Directive({
    selector: "[logOnClick]",
    hostListeners: {
        'click': 'onClick()',
    },
})
class LogOnClick {
    constructor() {}
    onClick() { console.log('Element clicked!'); }
}

Что будет использоваться так:

<button logOnClick>I log when clicked!</button>

Компоненты

Компонент вместо добавления/модификации поведения фактически создает свой собственный вид (иерархию элементов DOM) с приложенным поведением. Пример использования для этого может быть компонентом контактной карты:

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

@Component({
  selector: 'contact-card',
  template: `
    <div>
      <h1>{{name}}</h1>
      <p>{{city}}</p>
    </div>
  `
})
class ContactCard {
  @Input() name: string
  @Input() city: string
  constructor() {}
}

Что будет использоваться так:

<contact-card [name]="'foo'" [city]="'bar'"></contact-card>

ContactCard является многократно используемым компонентом пользовательского интерфейса, который мы можем использовать в любом месте нашего приложения, даже в других компонентах. Они в основном составляют компоненты пользовательского интерфейса наших приложений.

В заключение

Напишите компонент, если вы хотите создать многократно используемый набор элементов DOM пользовательского интерфейса с пользовательским поведением. Напишите директиву, когда вы хотите написать многоразовое поведение для дополнения существующих элементов DOM.

Источники:

  • 2
    аннотация @directive имеет свойство template / templateUrl?
  • 6
    Этот ответ все еще верен? Сам учебник angular2 создает компонент без представления
Показать ещё 7 комментариев
61

Компоненты

  1. Для регистрации компонента мы используем @Component метаданных @Component.
  2. Компонент - это директива, которая использует теневой DOM для создания инкапсулированного визуального поведения, называемого компонентами. Компоненты обычно используются для создания виджетов пользовательского интерфейса.
  3. Компонент используется, чтобы разбить приложение на более мелкие компоненты.
  4. Только один компонент может присутствовать на элемент DOM.
  5. @View декоратор или шаблон шаблона являются обязательными в компоненте.

директива

  1. Для регистрации директив мы используем @Directive метаданных @Directive.
  2. Директива используется для добавления поведения в существующий элемент DOM.
  3. Директива - это использование для разработки повторно используемых компонентов.
  4. Многие директивы могут быть использованы для каждого элемента DOM.
  5. Директива не использует вид.

Источники:

http://www.codeandyou.com/2016/01/difference-between-component-and-directive-in-Angular2.html

  • 0
    Вы можете использовать столько экземпляров компонентов, сколько хотите
  • 4
    Компоненты - пункт 4. Я думаю, что это неправильно - его можно использовать несколько раз. это на самом деле расширенная «Директива»
Показать ещё 1 комментарий
49

Компонент является директивой-с-шаблоном, а декоратор @Component на самом деле является декоратором @Directive, расширенным с использованием шаблонов.

  • 3
    Не уверен, почему тебя слишком сильно понизили. Кажется, что @Component - это директива с шаблоном (для создания представления) для меня.
18

В Angular 2 и выше "все является компонентом". Компоненты - это основной способ создания и определения элементов и логики на странице с помощью как пользовательских элементов, так и атрибутов, которые добавляют функциональность нашим существующим компонентам.

http://learnangular2.com/components/

Но что тогда делают директивы в Angular2+?

Директивы атрибутов прикрепляют поведение к элементам.

В Angular существует три вида директив:

  1. Компоненты - директивы с шаблоном.
  2. Структурные директивы - измените макет DOM, добавляя и удаляя элементы DOM.
  3. Директивы атрибутов - изменяют внешний вид или поведение элемента, компонента или другой директивы.

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, этот компонент будет создан, а конструктор будет вызван и обработан.

4

Обнаружение изменений

Только @Component может быть узлом в дереве обнаружения изменений. Это означает, что вы не можете установить ChangeDetectionStrategy.OnPush в @Directive. Несмотря на это, директива может иметь свойства @Input и @Input и из @Output вы можете внедрять и манипулировать хост-компонентом ChangeDetectorRef. Поэтому используйте Компоненты, когда вам нужен детальный контроль над деревом обнаружения изменений.

2

В контексте программирования директивы обеспечивают руководство для компилятора, чтобы изменить то, как он иначе будет обрабатывать ввод, то есть изменить некоторое поведение.

"Директивы позволяют вам привязывать поведение к элементам в DOM".

Директивы делятся на 3 категории:

  • атрибут
  • структурная
  • Составная часть

Да, в Angular 2 Компоненты являются типом директивы. Согласно Доку,

"Угловые компоненты - это подмножество директив. В отличие от директив, компоненты всегда имеют шаблон, и для каждого элемента в шаблоне может быть создан только один компонент".

Angular 2 Components - это реализация концепции веб-компонентов. Веб-компоненты состоят из нескольких отдельных технологий. Вы можете думать о веб-компонентах как о многократно используемых виджетах пользовательского интерфейса, которые создаются с использованием открытой веб-технологии.

  • Итак, в сводных директивах Механизм, с помощью которого мы прикрепляем поведение к элементам в DOM, состоящим из типов Structural, Attribute и Component.
  • Компоненты - это особый тип директивы, который позволяет нам использовать функциональность веб-компонента AKA для повторного использования - инкапсулированные, повторно используемые элементы, доступные в нашем приложении.
0

Если вы ссылаетесь на официальные угловые документы

https://angular.io/guide/attribute-directives

В Angular существует три вида директив:

  1. Компоненты - директивы с шаблоном.
  2. Структурные директивы - измените макет DOM, добавляя и удаляя элементы DOM. напр. * ngIf
  3. Директивы атрибутов - изменяют внешний вид или поведение элемента, компонента или другой директивы. например, [ngClass].

По мере роста Приложения мы испытываем трудности в поддержании всех этих кодов. В целях повторного использования мы разделяем нашу логику на интеллектуальные компоненты и немые компоненты и используем директивы (структурные или атрибутные) для внесения изменений в DOM.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню