違いは何ですか@Component
そして@Directive
角度で?
両方とも同じ仕事をしているようで、同じ属性を持っているようです。
ユースケースは何ですか?いつユースケースを優先させるのですか?
@Directiveは表示しませんが、@Componentはビューを必要とします。
@DirectiveとAngular 1.0ディレクティブをオプションで指定していますディレクティブは、既存のDOM要素または既存のコンポーネントインスタンスに動作を追加します(ディレクティブは属性の使用に限定されません)。ディレクティブの使用例の1つは、要素にクリックを記録することです。restrict: 'A'
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コンポーネントです。これらは基本的に、アプリケーションのUIビルディングブロックを構成します。
カスタム動作でUIのDOM要素の再利用可能なセットを作成する場合は、コンポーネントを作成します。既存のDOM要素を補うための再利用可能な動作を記述するときには、ディレクティブを作成します。
ソース:
コンポーネント
@Component
メタデータ注釈。@View
デコレータまたはテンプレートのテンプレートはコンポーネントで必須です。指令
@Directive
メタデータ注釈。ソース:
http://www.codeandyou.com/2016/01/difference-between-component-and-directive-in-Angular2.html
コンポーネントとは、ディレクティブ付きのテンプレートであり、@Component
デコレータは実際には@Directive
デコレータはテンプレート指向の機能で拡張されました。
Angular 2以上では、 "すべてがコンポーネントです。" ページ上の要素とロジックを構築して指定する主な方法は、 機能を追加するカスタム要素と属性の両方を介して 既存のコンポーネント。
http://learnangular2.com/components/
しかし、Angular2 +ではどのような指示が行われますか?
属性ディレクティブは、動作を要素に付加します。
Angularには3種類の指示があります:
- コンポーネント - ディレクティブとテンプレート。
- 構造指令の変更 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でタグを使用すると、このコンポーネントが作成され、コンストラクタが呼び出されてレンダリングされます。
のみ@Component
変更検出ツリー内のノードにすることができます。これは、あなたが設定できないことを意味しますChangeDetectionStrategy.OnPush
〜で@Directive
。この事実にもかかわらず、指令は、@Input
そして@Output
ホストコンポーネントの注入と操作が可能ですChangeDetectorRef
それから。したがって、変更検出ツリーを細かく制御する必要がある場合は、コンポーネントを使用します。
プログラミングの文脈では、ディレクティブはコンパイラが入力を処理する方法、つまり何らかの動作を変更する方法を変更するための指示をコンパイラに提供します。
"ディレクティブを使用すると、DOM内の要素に動作を割り当てることができます。"
ディレクティブは3つのカテゴリに分割されます。
はい、角2では、コンポーネントはディレクティブの一種です。 Docによると、
角型コンポーネントはディレクティブのサブセットです。ディレクティブとは異なり、コンポーネントには常にテンプレートがあり、テンプレート内の要素ごとに1つのコンポーネントしかインスタンス化できません。
角度2のコンポーネントは、Webコンポーネント概念。 Webコンポーネントは、いくつかの独立した技術で構成されていますWebコンポーネントは、オープンなWebテクノロジーを使用して作成された再利用可能なユーザーインターフェイスウィジェットと考えることができます。
あなたが正式な角度のドキュメントを参照する場合
https://angular.io/guide/attribute-directives
Angularには3種類の指示があります:
アプリケーションが大きくなるにつれて、これらのコードをすべて維持することが困難になります。再利用性のために、私たちはスマートコンポーネントとダムコンポーネントでロジックを分離し、DOMの変更にディレクティブ(構造または属性)を使用します。
@Component
デコレータは実際には@Directive
テンプレート指向の機能で拡張されたデコレータ - ソース。 - Cosmin Ababeidirectives
配列...多分以下のLida Wengのコメントは、コンポーネント "実際には拡張されたディレクティブ' " - Nobita