はいさい!オースティンやいびーん!
概要
新しくnpmパッケージをリリースしたので、共有します!
ngx-visible-autofocus
です。
AngularでHTMLElement
が見えてきた時に、それを自動的にフォーカスするDirectiveです。
問題
モーダルに隠れている<input>
が見えた時に自動的にフォーカスさせたかった。
解決
IntersectionObserverを使ってDirectiveがついている部品を観察し、見えてきたらその要素に対して.focus()
を呼ぶ
仕組み
部品ごとにIntersection Observerを作っていると、パフォーマンスが悪くなるので、ngx-visible-autofocusは、すべての部品に対して同じIntersectionObserverのインスタンスを使い回しています。
どうやって実現できたかというと、ngx-visible-autofocusは、Symbol
を使ってHTMLElement
に自分のユニークなSymbol
の鍵を、AutoFocusDirective.attributeKey
のSymbol
の属性に登録します。
そして、AutoFocusDirective.callbackCache
にこの部品が見えた時に実行する.focus()
を呼ぶ関数を、上記のユニークSymbol
の鍵で登録します。
そうすると、共通のAutoFocusDirective
の静的IntersectionObserverがこのDirectiveがついている部品を見た時に、それにバインドされているコールバック関数を呼ぶことができるのです。
デモ
まとめ
Angularを使っている人、もしこういう問題を抱えたことがありましたらぜひ使ってください!