@Directive v / s @Component in Angular

В нашем продукте мы используем varchar (32) для первичных ключей (GUID), и мы не сталкивались с такими проблемами производительности. Наш продукт представляет собой веб-сайт с экстремальной перегрузкой и имеет решающее значение для стабильности. Мы используем SQL Server 2005.

Редактирование: в наших самых больших таблицах у нас есть более 3 000 000 записей с большим количеством вставок и выбора из них. Я думаю, в общем, преимущество перехода на ключ int будет очень низким, но проблемы при очень высокой миграции.

372
задан shammelburg 31 May 2017 в 13:28
поделиться

8 ответов

@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 - это компонент пользовательского интерфейса многократного использования, который мы могли бы использовать в любом месте нашего приложения, даже внутри других компонентов. Они в основном составляют строительные блоки UI наших приложений.

Вкратце

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

Источники:

474
ответ дан Lazar Ljubenović 31 May 2017 в 13:28
поделиться

Компонент представляет собой директиву с шаблоном, а декоратор @Component фактически является декоратором @Directive, расширенным с помощью шаблонно-ориентированных функций.

52
ответ дан madhead 31 May 2017 в 13:28
поделиться

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

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

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

  • Атрибут
  • Структурный
  • Компонент

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

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

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

  • Таким образом, в сводных директивах Механизм, с помощью которого мы присоединяем поведение к элементам в DOM, состоящим из типов Structural, Attribute и Component.
  • Компоненты - это особый тип директивы, который позволяет нам использовать функциональность веб-компонента Возможность многократного использования AKA - инкапсулированные, повторно используемые элементы, доступные в нашем приложении.
4
ответ дан Sachila Ranawaka 31 May 2017 в 13:28
поделиться

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

21
ответ дан Alireza 31 May 2017 в 13:28
поделиться

Компоненты

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

Директива

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

Источники:

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

68
ответ дан Aniruddha Das 31 May 2017 в 13:28
поделиться

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

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

6
ответ дан Evgeniy Malyutin 31 May 2017 в 13:28
поделиться

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

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

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

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

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

2
ответ дан Akshay Rajput 31 May 2017 в 13:28
поделиться

Компоненты

Компоненты являются самым основным стандартным блоком UI Углового приложения. Угловое приложение содержит дерево Угловых компонентов. Наше приложение в Угловом основано дерево компонента . Каждый компонент должен иметь свой шаблон, моделирование, жизненный цикл, селектор, и т.д. Так, каждый компонент имеет свою структуру , можно рассматривать их как независимо автономное маленькое веб-приложение с собственным шаблоном и логикой и возможностью связаться и использоваться вместе с другими компонентами.

Образец .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>

, поскольку AppTrainingComponent был представлен здесь

, Видят [еще 116] о Компонентах

Директивы

, Директива изменяет появление или поведение существующего элемента 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>

См. [еще 117] о директивах

0
ответ дан 22 November 2019 в 23:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: