Angular2を使い始めたばかりです。
Angular 2のコンポーネントとディレクティブの違いは何ですか?
回答:
ドキュメントによると、基本的にAngular2には3つのタイプのディレクティブがあります。
これは、Angular2の中で最も有名なタイプのディレクティブである、テンプレート、スタイル、およびロジック部分を備えたタイプのディレクティブでもあります。このタイプのディレクティブでは、カスタムであるか、@Component
アノテーションに組み込まれているかに関係なく、次のような他のディレクティブを使用できます。
@Component({
selector: "my-app"
directives: [custom_directive_here]
})
ビューでこのディレクティブを次のように使用します。
<my-app></my-app>
コンポーネントディレクティブについては、ここで最良のチュートリアルを見つけました。
のよう*ngFor
に*ngIf
、DOM要素を追加および削除することによってDOMレイアウトを変更するために使用されます。ここで説明
これらは、いくつかの関数/ロジックを適用することにより、既存の要素にカスタムの動作またはスタイルを与えるために使用されます。LikengStyle
は、要素に動的にスタイルを与える属性ディレクティブです。独自のディレクティブを作成し、これをいくつかの定義済み要素またはカスタム要素の属性として使用できます。単純なディレクティブの例を次に示します。
まず、からディレクティブをインポートする必要があります @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
ます。
そのため、ホスト要素には1つのコンポーネントしか存在できませんが、複数のディレクティブが存在する可能性があります。
構造ディレクティブは、<template>
要素に適用され、コンテンツを追加/削除する(テンプレートにスタンプを付ける)ために使用されるディレクティブです。の*
ようなinディレクティブアプリケーション*ngIf
は、<template>
タグを暗黙的に作成します。
Günterが言ったことを完了するために、2種類のディレクティブを区別できます。
NgFor
とNgIf
です。これらはテンプレートの概念にリンクされており、接頭辞として*
。を付ける必要があります。詳細については、このリンクの「テンプレートと*」のセクションを参照してください:http://victorsavkin.com/post/119943127151/angular-2-template-syntaxそれがあなたを助けることを願っています、ティエリー
コンポーネントは、ビューが関連付けられたディレクティブです(つまり、レンダリングされるHTML)。すべてのコンポーネントはディレクティブですが、すべてのディレクティブがコンポーネントであるとは限りません。ディレクティブには次の3つのタイプがあります。
*ngIf
、DOM要素(またはカスタムDOM要素であるがDOM要素である角度コンポーネント)を挿入または削除できるものです。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>
要素に配置され、要素を挿入するかどうかを決定します。<div>
条件付き式がかどうかに応じて表示されますmyBool
に強制変換することができますtrue
。Angular 2は、アーキテクチャのコンポーネント/サービスモデルに従います。
角度2アプリケーションはコンポーネントで構成されています。コンポーネントは、HTMLテンプレートと、画面の一部を制御するコンポーネントクラス(typescriptクラス)の組み合わせです。
グッドプラクティスとして、コンポーネントクラスはそれぞれのビューへのデータバインディングに使用されます。双方向データバインディングは、Angularフレームワークによって提供される優れた機能です。
コンポーネントは、提供されたセレクター名を使用して、アプリケーション全体で再利用できます。
コンポーネントは、テンプレートを使用した一種のディレクティブでもあります。
他の2つのディレクティブは
構造ディレクティブ-DOM要素を追加および削除してDOMレイアウトを変更します。例: NgFor
およびNgIf
。
属性ディレクティブ-要素、コンポーネント、または別のディレクティブの外観または動作を変更します。例: NgStyle
実際にはコンポーネントもディレクティブですが、それらの間には違いがあります。
属性ディレクティブ:
属性ディレクティブは、単一の要素の動作または外観を変更できるクラスです。属性ディレクティブを作成する@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>
コンポーネント:
コンポーネントは、他の場所から提供されたコンテンツに依存するのではなく、独自のテンプレートであるディレクティブです。コンポーネントは、すべてのディレクティブ機能にアクセスでき、ホスト要素を持ち、入力プロパティと出力プロパティを定義できますが、独自のコンテンツも定義します。
テンプレートの重要性を過小評価するのは簡単ですが、属性と構造ディレクティブには制限があります。ディレクティブは便利で強力な作業を行うことができますが、適用される要素についてはあまり洞察がありません。ディレクティブは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;
}