Kullanıcı bu açılır listenin dışında herhangi bir yeri tıkladığında giriş menüsü açılır menüsümü kapatmak istiyorum ve bunu Angular2 ve Angular2 "yaklaşımı" ile yapmak istiyorum ...
Bir çözüm uyguladım, ama gerçekten kendime güvenmiyorum. Aynı sonucu elde etmenin en kolay yolunun olduğunu düşünüyorum, bu yüzden herhangi bir fikriniz varsa ... konuşalım :)!
İşte benim uygulama:
Açılır bileşen:
Bu benim açılır listemin bileşenidir:
- Her zaman görünür ayarlı bu bileşen, (Örneğin: Bir butona kullanıcı tıklama görüntülemek için zaman) "global" rxjs konu abone usermenu içinde depolanan SubjectsService .
- Ve her gizlendiğinde, bu konudan çıkar.
- Tüm tıklama yerde dahilinde bu bileşen tetik şablona onClick () üstüne yöntem, sadece durdurma olay köpüren (ve uygulama bileşeni)
İşte kod
export class UserMenuComponent {
_isVisible: boolean = false;
_subscriptions: Subscription<any> = null;
constructor(public subjects: SubjectsService) {
}
onClick(event) {
event.stopPropagation();
}
set isVisible(v) {
if( v ){
setTimeout( () => {
this._subscriptions = this.subjects.userMenu.subscribe((e) => {
this.isVisible = false;
})
}, 0);
} else {
this._subscriptions.unsubscribe();
}
this._isVisible = v;
}
get isVisible() {
return this._isVisible;
}
}
Uygulama bileşeni:
Öte yandan, uygulama bileşeni (açılır bileşenin üst öğesi olan) vardır:
- Bu bileşen her tıklama etkinliğini yakalar ve aynı rxjs'de yayılır Konu ( userMenu )
İşte kod:
export class AppComponent {
constructor( public subjects: SubjectsService) {
document.addEventListener('click', () => this.onClick());
}
onClick( ) {
this.subjects.userMenu.next({});
}
}
Beni ne rahatsız ediyor:
- Bu bileşenler arasında konektör görevi gören küresel bir Konuya sahip olma fikrinden pek rahat hissetmiyorum.
- SetTimeout : Burada butona kullanıcı tıklama açılan gösteriyor ki eğer aksi ne olur, çünkü bu gereklidir:
- Kullanıcı, açılır menüyü göstermek için düğmeyi (açılır bileşenin bir parçası olmayan) tıklar.
- Açılır menü görüntülenir ve hemen userMenu konusuna abone olur .
- Tıklama etkinliği, uygulama bileşenine ulaşır ve yakalanır
- Uygulama bileşeni, userMenu konusunda bir olay yayar
- Açılır bileşen, userMenu'da bu eylemi yakalar ve açılır menüyü gizler.
- Sonunda açılır menü hiçbir zaman görüntülenmez.
Bu ayarlanan zaman aşımı, sorunu çözen mevcut JavaScript kod dönüşünün sonuna kadar aboneliği geciktirir, ancak bence çok zarif bir şekilde.
Daha temiz, daha iyi, daha akıllı, daha hızlı veya daha güçlü çözümler biliyorsanız, lütfen bana bildirin :)!