Angularの作業を始めたばかりです2。
Angular 2のコンポーネントとディレクティブの違いは何ですか?
基本的に、ドキュメントによると、Angular2には3種類のディレクティブがあります。
また、Angular2の中で最も有名なタイプのディレクティブである、テンプレート、スタイル、およびロジック部分を持つディレクティブのタイプでもあります。このタイプのディレクティブでは、次のようなカスタムディレクティブまたは@Component
アノテーションに組み込まれている他のディレクティブを使用できます。
@Component({
selector: "my-app"
directives: [custom_directive_here]
})
ビューでこのディレクティブを次のように使用します。
<my-app></my-app>
コンポーネントディレクティブについては、最高のチュートリアルを見つけました こちら
*ngFor
や*ngIf
と同様、DOM要素を追加および削除してDOMレイアウトを変更するために使用されます。 ここで説明
これらは、いくつかの関数/ロジックを適用することにより、既存の要素にカスタム動作またはスタイルを与えるために使用されます。 Like ngStyle
は、要素にスタイルを動的に与える属性ディレクティブです。独自のディレクティブを作成し、これをいくつかの定義済みまたはカスタム要素の属性として使用できます。ここに単純なディレクティブの例を示します。
まず、@angular/core
からディレクティブをインポートする必要があります
import {Directive, ElementRef, Renderer, Input} from '@angular/core';
@Directive({
selector: '[Icheck]',
})
export class RadioCheckbox {
// custom logic here...
}
以下に示すように、ビューでこれを使用できます。
<span Icheck>HEllo Directive</span>
コンポーネントには独自のビュー(HTMLおよびスタイル)があります。ディレクティブは、既存の要素とコンポーネントに追加される「動作」にすぎません。Component
はDirective
を拡張します。
そのため、Host要素には1つのコンポーネントしか存在できませんが、複数のディレクティブがあります。
構造ディレクティブは、<template>
要素に適用され、コンテンツの追加/削除(テンプレートのスタンプ)に使用されるディレクティブです。 *
のようなディレクティブアプリケーションの*ngIf
により、<template>
タグが暗黙的に作成されます。
ギュンターが言ったことを完了するために、2種類の指令を区別できます。
NgFor
とNgIf
です。これらはテンプレートの概念にリンクされており、*
を前に付ける必要があります。詳細については、このリンクの「テンプレートと*」セクションを参照してください。 http://victorsavkin.com/post/119943127151/angular-2-template-syntaxお役に立てばと思います、ティエリー
Angular 2は、アーキテクチャのコンポーネント/サービスモデルに従います。
angular 2アプリケーションはコンポーネントで構成されています。コンポーネントは、HTMLテンプレートと、画面の一部を制御するコンポーネントクラス(TypeScriptクラス)の組み合わせです。
良い習慣として、コンポーネントクラスはそれぞれのビューへのデータバインディングに使用されます。双方向データバインディングは、angularフレームワークによって提供される優れた機能です。
コンポーネントは、提供されたセレクター名を使用してアプリケーション全体で再利用できます。
コンポーネントは、テンプレートを持つディレクティブの一種でもあります。
他の2つのディレクティブは
構造ディレクティブ—DOM要素を追加および削除してDOMレイアウトを変更します。例:NgFor
およびNgIf
。
属性ディレクティブ-要素、コンポーネント、または別のディレクティブの外観または動作を変更します。例:NgStyle
これが実際の定義です。
他の定義は間違っています。
コンポーネントは、関連付けられたビュー(つまり、レンダリングされるHTML)を持つディレクティブです。すべてのコンポーネントはディレクティブですが、すべてのディレクティブがコンポーネントではありません。ディレクティブには次の3つのタイプがあります。
*ngIf
(またはカスタムDOM要素ですが、それでもDOM要素であるangularコンポーネント)。import { Component, HostListener, HostBinding, Directive, ElementRef } from '@angular/core';
@Directive({
selector: '[appHighlight]'
})
export class HighlightDirective {
constructor(el: ElementRef) {
el.nativeElement.style.backgroundColor = 'yellow';
}
}
@Component({
selector: 'app-root',
template: `
<div *ngIf='myBool' appHighlight>Hi there</div>
`,
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
myBool:boolean = true;
}
上記の例では、次のことを確認できます。
AppComponent
には、表示される<div>
要素を持つテンプレートがあります。<div>
要素にあります。これは、<div>
要素の動作を操作することを意味します。この場合、テキストが強調表示され、黄色に変わります。*ngIf
も<div>
要素にあり、要素を挿入するかどうかを決定します。式myBool
をtrue
に強制できるかどうかに応じて、<div>
が条件付きで表示されます。実際にはコンポーネントもディレクティブですが、違いがあります。
属性ディレクティブ:
属性ディレクティブは、単一の要素の動作または外観を変更できるクラスです。属性ディレクティブを作成するには、@Directive
をクラスに適用します。
import { Directive, ElementRef } from "@angular/core";
@Directive({
selector: "[custom-attr]", })
export class CustomAttrDirective {
constructor(element: ElementRef) {
element.nativeElement.classList.add("bg-success", "text-white");
}
}
ディレクティブ属性template.htmlファイルの追加
<tr *ngFor="let item of getProducts(); let i = index" custom-attr>
<td>{{i + 1}}</td>
<td>{{item.name}}</td>
</tr>
構造ディレクティブ:
構造ディレクティブは、マイクロテンプレートとして要素を追加および削除することにより、HTMLドキュメントのレイアウトを変更します。構造ディレクティブを使用すると、*ngIf
などの式の結果に基づいて条件付きでコンテンツを追加したり、*ngFor
などのデータソース内の各オブジェクトに対して同じコンテンツを繰り返したりできます。
組み込みのディレクティブを一般的なタスクに使用できますが、カスタム構造ディレクティブを記述すると、アプリケーションに合わせて動作を調整できます。
<p *ngIf="true">
Expression is true and ngIf is true.
This paragraph is in the DOM.
</p>
<p *ngIf="false">
Expression is false and ngIf is false.
This paragraph is not in the DOM.
</p>
コンポーネント:
コンポーネントは、他の場所から提供されるコンテンツに依存するのではなく、独自のテンプレートのディレクティブです。コンポーネントはすべてのディレクティブ機能にアクセスでき、依然としてHost要素を持ち、入力および出力プロパティを定義できます。ただし、独自のコンテンツも定義します。
テンプレートの重要性を過小評価するのは簡単ですが、属性と構造ディレクティブには制限があります。ディレクティブは有用で強力な作業を行うことができますが、適用される要素についてはあまり洞察がありません。ディレクティブは、ngModel
ディレクティブなどの汎用ツールである場合に最も役立ちます。これは、データや要素の用途に関係なく、データモデルプロパティやフォーム要素に適用できます。
コンポーネントは、対照的に、テンプレートのコンテンツと密接に結びついています。コンポーネントは、テンプレート内のHTML要素に適用されるデータバインディングで使用されるデータとロジックを提供します。これは、データバインディング式を評価し、ディレクティブとアプリケーションの他の部分との間の接着剤として機能するコンテキストを提供します。コンポーネントは、大きなAngularプロジェクトを管理可能なチャンクに分割できる便利なツールでもあります。
import { Component, Input } from '@angular/core';
import { Hero } from './hero';
@Component({
selector: 'app-hero-child',
template: `
<h3>{{hero.name}} says:</h3>
<p>I, {{hero.name}}, am at your service, {{masterName}}.</p>
`
})
export class HeroChildComponent {
@Input() hero: Hero;
@Input('master') masterName: string;
}