আমি যখন ব্যবহারকারী সেই ড্রপডাউনটির বাইরে যে কোনও জায়গায় ক্লিক করে আমার লগইন মেনু ড্রপডাউনটি বন্ধ করতে চাই এবং আমি এটি Angular2 এবং Angular2 "অ্যাপ্রোচ" দিয়ে করতে চাই ...
আমি একটি সমাধান বাস্তবায়ন করেছি, তবে আমি এটির সাথে সত্যই আত্মবিশ্বাসী বোধ করি না। আমি মনে করি একই ফলটি অর্জনের একটি সহজ উপায় থাকতে হবে, সুতরাং আপনার যদি কিছু ধারণা থাকে ... আসুন আলোচনা করুন :)!
আমার বাস্তবায়ন এখানে:
ড্রপডাউন উপাদান:
এটি আমার ড্রপডাউনয়ের উপাদান:
- প্রতিটি সময় এই উপাদানটি এটিকে দৃশ্যমান সেট করতে চান, (উদাহরণস্বরূপ: একটি বোতামে ব্যবহারকারী ক্লিক এটি প্রদর্শন করে যখন) এটি একটি "বিশ্বব্যাপী" সাবস্ক্রাইব rxjs বিষয় userMenu মধ্যে সঞ্চিত SubjectsService ।
- এবং যতবার এটি লুকানো থাকে ততবার এই বিষয়টিকে সাবস্ক্রাইব করে।
- এই উপাদানটির টেমপ্লেটের মধ্যে যে কোনও জায়গায় ক্লিক ক্লিক করে অনক্লিক () পদ্ধতিটি ট্রিগার করে , যা কেবল ইভেন্টটি উপরের দিকে (এবং অ্যাপ্লিকেশন উপাদান) বুদবুদ থামিয়ে দেয় which
কোডটি এখানে
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 সাবজেক্টে ( ব্যবহারকারীমেনু ) প্রেরণ করে
কোডটি এখানে:
export class AppComponent {
constructor( public subjects: SubjectsService) {
document.addEventListener('click', () => this.onClick());
}
onClick( ) {
this.subjects.userMenu.next({});
}
}
আমাকে কী বিরক্ত করেছে:
- আমি একটি গ্লোবাল সাবজেক্ট থাকা এই ধারণাগুলির মধ্যে সংযোগকারী হিসাবে কাজ করার ধারণার সাথে সত্যই স্বাচ্ছন্দ্য বোধ করি না।
- setTimeout এই প্রয়োজন হয় কারণ এখানে কি অন্যথায় ঘটতে যে যদি ড্রপডাউন দেখান বাটনে ব্যবহারকারী ক্লিক হল:
- ড্রপডাউনটি দেখানোর জন্য ব্যবহারকারী বোতামটিতে ক্লিক করুন (যা ড্রপডাউন উপাদানটির একটি অংশ নয়)।
- ড্রপডাউন প্রদর্শিত হয় এবং এটি অবিলম্বে ব্যবহারকারীমেনু সাবস্ক্রাইব করে ।
- অ্যাপ্লিকেশন উপাদানটি ক্লিক ইভেন্ট বুদবুদ এবং ধরা পড়ে
- অ্যাপ্লিকেশন উপাদানটি ব্যবহারকারীমেনু বিষয়ে একটি ইভেন্ট নির্গত করে
- ড্রপডাউন উপাদান ধরা এই কর্ম userMenu এবং ড্রপডাউন লুকান।
- শেষে ড্রপডাউনটি কখনই প্রদর্শিত হয় না।
এই সেট টাইমআউটটি বর্তমান জাভাস্ক্রিপ্ট কোড টার্নের সাবস্ক্রিপশনটিকে বিলম্ব করে যা সমস্যার সমাধান করে তবে আমার মতে খুব মার্জিত উপায়ে।
আপনি যদি ক্লিনার, আরও ভাল, স্মার্ট, দ্রুত বা শক্তিশালী সমাধানগুলি জানেন তবে দয়া করে আমাকে জানান :)!