當(dāng)用戶單擊下拉菜單之外的任何地方時(shí),我想關(guān)閉我的登錄菜單下拉菜單,我想使用Angular2和Angular2“方法”來完成此操作...我已經(jīng)實(shí)現(xiàn)了一個(gè)解決方案,但是我對(duì)此確實(shí)沒有信心。我認(rèn)為必須有一種最簡(jiǎn)單的方法來獲得相同的結(jié)果,因此,如果您有任何想法...讓我們討論一下:)!這是我的實(shí)現(xiàn):下拉組件:這是我的下拉菜單的組件:每次將此組件設(shè)置為可見時(shí),(例如:當(dāng)用戶單擊按鈕以顯示它時(shí))它都會(huì)訂閱一個(gè)存儲(chǔ)在SubjectsService中的“全局” rxjs主題userMenu。每次隱藏時(shí),它都會(huì)退訂該主題。該組件模板內(nèi)任何位置的每次點(diǎn)擊都會(huì)觸發(fā)onClick()方法,該方法只會(huì)停止將事件冒泡到頂部(和應(yīng)用程序組件)這是代碼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; }}應(yīng)用程序組件:另一方面,有應(yīng)用程序組件(它是下拉組件的父級(jí)):該組件捕獲每個(gè)click事件并在相同的rxjs Subject(userMenu)上發(fā)出這是代碼:export class AppComponent { constructor( public subjects: SubjectsService) { document.addEventListener('click', () => this.onClick()); } onClick( ) { this.subjects.userMenu.next({}); }}什么困擾我:我對(duì)于讓全局主題充當(dāng)這些組件之間的連接器的想法感到非常不滿意。該setTimeout的:這是必要的,因?yàn)檫@里是,如果在此按鈕,用戶點(diǎn)擊,顯示的下拉什么,否則會(huì)發(fā)生:用戶單擊按鈕(不是下拉菜單組件的一部分)以顯示下拉菜單。顯示該下拉菜單,它立即訂閱userMenu主題。點(diǎn)擊事件冒泡到應(yīng)用程序組件并被捕獲應(yīng)用程序組件在userMenu主題上發(fā)出事件下拉組件在userMenu上捕獲此操作,并隱藏下拉菜單。最后,從不顯示下拉列表。這個(gè)設(shè)置的超時(shí)將訂閱延遲到當(dāng)前JavaScript代碼回合的末尾,從而解決了問題,但是我認(rèn)為這是一種非常優(yōu)雅的方式。如果您知道更清潔,更好,更智能,更快或更強(qiáng)大的解決方案,請(qǐng)告訴我:)!
如何關(guān)閉外部點(diǎn)擊的下拉菜單?
明月笑刀無情
2019-12-12 13:47:31