ฉันต้องการปิดเมนูดร็อปดาวน์ของฉันเมื่อผู้ใช้คลิกที่ใดก็ได้นอกเหนือจากดรอปดาวน์นั้นและฉันต้องการจะทำเช่นนั้นกับ Angular2 และกับ Angular2 "วิธี" ...
ฉันติดตั้งโซลูชันแล้ว แต่ฉันไม่รู้สึกมั่นใจเลย ฉันคิดว่าต้องมีวิธีที่ง่ายที่สุดในการบรรลุผลลัพธ์เดียวกันดังนั้นหากคุณมีความคิดใด ๆ ... มาคุยกัน :)!
นี่คือการดำเนินการของฉัน:
องค์ประกอบแบบเลื่อนลง:
นี่เป็นส่วนประกอบสำหรับดรอปดาวน์ของฉัน:
- ทุกครั้งที่ส่วนนี้มันตั้งค่าให้สามารถมองเห็นได้ (ตัวอย่างเช่นเมื่อผู้ใช้คลิกที่ปุ่มเพื่อแสดง) ก็สมัครเป็นสมาชิก "ทั่วโลก" rxjs เรื่องuserMenuเก็บไว้ภายในSubjectsService
- และทุกครั้งที่มันถูกซ่อนไว้
- ทุกการคลิกที่ใดก็ได้ภายในเทมเพลตของส่วนประกอบนี้จะเรียกใช้เมธอดonClick ()ซึ่งเพิ่งหยุดเหตุการณ์ที่เดือดดาลไปด้านบน (และส่วนประกอบแอปพลิเคชัน)
นี่คือรหัส
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
- องค์ประกอบแบบเลื่อนลงจับการกระทำนี้ในuserMenuและซ่อนรายการแบบเลื่อนลง
- ในตอนท้ายดรอปดาวน์จะไม่ปรากฏขึ้น
การหมดเวลาที่ตั้งไว้นี้ล่าช้าการสมัครสมาชิกถึงจุดสิ้นสุดของรหัส JavaScript ปัจจุบันซึ่งแก้ไขปัญหาได้
หากคุณรู้จักวิธีทำความสะอาดที่ดีกว่าฉลาดขึ้นเร็วขึ้นหรือแข็งแกร่งขึ้นโปรดแจ้งให้เราทราบ :)!