前にAngularのチュートリアルをやったことはあったけど、この時はTypeScriptもよくわかっていなかったし、尚且つRailsでの開発しかしたことがなかったので、JavaScriptの知識もたいしてないというアカン状況だったので、全くAngularが理解できていなかった。
ですが、この頃はガッツリ、フロントエンドの開発ばかりやっているので、前よりはAngularを理解できるはずということで、もう一度、腰を入れてAngularのチュートリアルに再挑戦してみます。
前提条件としてTypeScriptは必須だと思います。詳細に理解するまではいかなくても本を一通り理解しておくぐらいまではいっておかないとというレベル。僕もTypeScriptの知識が深まってチュートリアルをやってみたのですが、前よりは格段に理解力は上がったと思いました。
TypeScriptの理解なしにチュートリアルを進めるとangularの機能なのかそれともTypeScriptの機能なのが頭がごちゃになるので、できればTypeScriptをやったあとにチュートリアルを進めた方がいいのですが、最低限、これは知っておいた方がいいものが多く最初から出ているので、それをまとめときます。
ヒーローエディタ編でまず、?になるのは、このデコレータ関数だと思います。
公式にはさらっとこんな風に書かれているだけなので、こんなもんかと思って飛ばしがちですが、このデコレータ関数といものがどういうものか理解しておくのは大事。
@Componentは、コンポーネントのAngularメタデータを指定するデコレーター関数です。
@Component({
selector: 'app-heroes',
templateUrl: './heroes.component.html',
styleUrls: ['./heroes.component.css']
})
まずこのデコレータは、TypeScriptの機能。Angularなどのフレームワークに多用されます。デコレータ自体は本質はただの関数。
デコレータは名前通りケーキをデコレーションするなどの意味と一緒。つまり、クラスを受けっとってデコレーションするのがデコレータ。なんでこのデコレータをAngularで使うのかというと開発がしやすいから。
@Component
というデコレータを作っておけば、いろんなクラスのところに、この@Component
を適用でき、selector
やtemplateUrl
の中身を入れ替えるだけで済むので、便利。クラスの前にデコレータが出てきたら、最初はこれは何かを共通化っぽいことをしてくれる便利なものなのねというくらいの理解でいい。
次に?となるのが、constructor関数。このconstructor関数は何をするのかというとHeroesComponentクラス
をもとにオブジェクトを作成するときに実行される関数。つまりは初期化を行う。
このconstructor関数は値も受けとることもできる。
export class HeroesComponent implements OnInit {
constructor() { }
ngOnInit() {}
}
次に?となるのが、implements。implementsとは、クラスにたいしてInterfaceをの条件を適用させるのに使うもの。まぁ、要は同時にクラスとInterfaceを使うというもの。
そもそもInterfaceが何かというとざっくり言えば「オブジェクトの型」。
この場合は、このHeroesComponent
クラスにたいしてimplementsを使ってOnInit
の型の条件を適用させている。
で、このOnInitangularのライフサイクルフックの一つで、何をしているのかと言うと初期化をしている。
初期化という点では、constructor関数と一緒ですが、OnInit
はHeroesComponentクラス
作成後に初期化を行います。要は順番が違います。
何か値をHeroesComponentクラス
に渡して何かしらのオブジェクトを作成するときはconstructor関数を使いますが、そうじゃなくて、ページのクリックなのど見た目の部分では、このOnInitを使用します。
チュートリアルの前半からangularの基本的かつ重要なことが出ているので、ある程度の理解してないといけない。
この章で重要なのは@Input()とプロパティバインディングです。
単純な親子関係ねぇくらいの中途半端な理解で進めるとあとで何回もドキュメントを見直すハメになるので注意。
この@Inputデコレータ
をプロパティに渡すことで、子であるHeroDetailComponent
は親であるHeroesComponent
から値を受け取ることができる。
@Input() hero: Hero;
そして親であるHeroesComponent
はheroプロパティにバインド、つまり関連づけるためにAngularのプロパティバインディングを使います。
<app-hero-detail [hero]="selectedHero"></app-hero-detail>