オフィス狛 技術部のKoma(Twitterアカウントの中の人&CEO)です。
Angularは、自コンポーネント内の項目についてのイベントは簡単に定義出来ます。
[View側]
<button class="button_close" type="button" (click)="close()">閉じる</button>
[Component側]
close() { // ここに処理を記載 }
しかし、自コンポーネント以外のイベントを取るとなると、ちょっと工夫が要ります。
例えば、下記のような要素があったとします。
「Company」リンクをクリックすれば、吹き出しが出るのは簡単に実装出来ますが、
『吹き出し以外をクリックしたら、吹き出しを閉じる』はどうやって実装したら良いでしょうか?
こんな時に、「HostListener」を使用します。
その名の通り、HostのイベントをListen出来ます。
import { Component, ChangeDetectionStrategy, OnInit, HostListener, ElementRef } from '@angular/core'; import { Router } from '@angular/router'; @Component({ selector: 'move-homepage-header', changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './homepage-header.component.html' }) export class HompageHeaderComponent implements OnInit { isShownCompanyPopUp = false; constructor( private eRef: ElementRef, private router: Router ) {} ngOnInit() {} @HostListener('document:click', ['$event']) onClickOut(event) { if (!this.eRef.nativeElement.contains(event.target)) { this.isShownCompanyPopUp = false; } } showCompanyPopup() { this.isShownCompanyPopUp = !this.isShownCompanyPopUp; } linkCompanyInfo() { this.isShownCompanyPopUp = false; this.router.navigateByUrl('/home/companyinfo'); } linkCompanyMap() { this.isShownCompanyPopUp = false; this.router.navigateByUrl('/home/companymap'); } linkPrivacyPolicy() { this.isShownCompanyPopUp = false; this.router.navigateByUrl('/home/privacypolicy'); } }
HostListenerのimportは忘れないように記載して下さい。
さて、肝心の部分を抜粋すると・・・・
@HostListener('document:click', ['$event']) onClickOut(event) { if (!this.eRef.nativeElement.contains(event.target)) { this.isShownCompanyPopUp = false; } }
今回は、「documentのclickイベント」を使用しています。
ただ、これだと、吹き出しの中のクリックイベントまで対象になってしまうので、
自コンポーネント内は除外し、『自コンポーネント内以外をクリック』のイベントを取る事を実現しています。
いかがでしょうか?
この方法で、windowのresizeイベントも取れると思います。
Angular
0 件のコメント:
コメントを投稿