जब उपयोगकर्ता उस ड्रॉपडाउन के बाहर कहीं भी क्लिक करता है, तो मैं अपना लॉगिन मेनू ड्रॉपडाउन बंद करना चाहूंगा, और मैं ऐसा करना चाहूंगा कि Angular2 के साथ और Angular2 "दृष्टिकोण" के साथ ...
मैंने एक समाधान लागू किया है, लेकिन मैं वास्तव में इसके साथ आत्मविश्वास महसूस नहीं करता हूं। मुझे लगता है कि समान परिणाम प्राप्त करने का एक आसान तरीका होना चाहिए, इसलिए यदि आपके पास कोई विचार है ... तो चर्चा करें :)!
यहाँ मेरा कार्यान्वयन है:
ड्रॉपडाउन घटक:
यह मेरी ड्रॉपडाउन के लिए घटक है:
- हर बार इस घटक यह दृश्यमान पर सेट, (उदाहरण के लिए: जब एक बटन पर उपयोगकर्ता क्लिक यह प्रदर्शित करने के लिए) यह एक "वैश्विक" rxjs विषय की सदस्यता userMenu में संग्रहीत SubjectsService ।
- और हर बार जब यह छिपा होता है, तो यह इस विषय पर सदस्यता समाप्त कर देता है।
- इस घटक के टेम्प्लेट के भीतर हर क्लिक कहीं भी ऑनकिक () विधि को ट्रिगर करता है , जो शीर्ष पर (और एप्लिकेशन घटक) ईवेंट बब्बलिंग को रोक देता है
यहाँ कोड है
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;
}
}
आवेदन घटक:
दूसरी ओर, अनुप्रयोग घटक है (जो ड्रॉपडाउन घटक का जनक है):
- यह घटक हर क्लिक इवेंट को पकड़ता है और एक ही rxjs विषय ( userMenu ) पर निकलता है
यहाँ कोड है:
export class AppComponent {
constructor( public subjects: SubjectsService) {
document.addEventListener('click', () => this.onClick());
}
onClick( ) {
this.subjects.userMenu.next({});
}
}
मुझे क्या परेशान:
- मैं उन घटकों के बीच संबंधक के रूप में कार्य करने वाले वैश्विक विषय के विचार के साथ वास्तव में सहज महसूस नहीं करता।
- SetTimeout : यह इसलिए आवश्यक है क्योंकि यहाँ क्या अन्यथा ऐसा है कि अगर लटकती दिखाने के बटन पर उपयोगकर्ता क्लिक है:
- उपयोगकर्ता ड्रॉपडाउन दिखाने के लिए बटन (जो ड्रॉपडाउन घटक का हिस्सा नहीं है) पर क्लिक करता है।
- ड्रॉपडाउन प्रदर्शित किया गया है और यह तुरंत उपयोगकर्तामेनू विषय की सदस्यता लेता है ।
- क्लिक इवेंट बबल अप करने के लिए एप्लिकेशन घटक है और पकड़ा जाता है
- अनुप्रयोग घटक userMenu विषय पर एक घटना का उत्सर्जन करता है
- ड्रॉपडाउन घटक userMenu पर इस क्रिया को पकड़ता है और ड्रॉपडाउन को छिपाता है।
- अंत में ड्रॉपडाउन कभी प्रदर्शित नहीं होता है।
इस सेटआउट ने सदस्यता को वर्तमान जावास्क्रिप्ट कोड टर्न के अंत में विलंबित कर दिया है जो समस्या को हल करता है, लेकिन मेरी राय में बहुत ही सुरुचिपूर्ण तरीके से।
यदि आप क्लीनर, बेहतर, होशियार, तेज या मजबूत समाधान जानते हैं, तो कृपया मुझे बताएं :)!