2013-01-15 9 views
6

इस प्रश्न का शायद कोई जवाब नहीं है। लेकिन, मैंने सोचा कि मैं इसे एक शॉट दूंगा। मैंने एक महान एक-पेज एप्लिकेशन लिखा था। जब एप्लिकेशन शुरू होता है, तो खुला टैब "रजिस्ट्रार" सर्वर के साथ ही होता है, जो स्टोर "सक्रिय" टैब के रूप में होता है।पहचानें कि किस टैब ने अनुरोध किया है

यदि उपयोगकर्ता ए कार्यक्षेत्र में XYZ बदलता है, तो किसी भी उपयोगकर्ता द्वारा उस कार्यक्षेत्र पर खोला गया प्रत्येक टैब, एक सूचना प्राप्त करता है कि XYZ बदल दिया गया था। यह ग्राहकों में एक रीलोड ट्रिगर करता है, जो जादुई रूप से अपडेट किया जाएगा। फिलहाल, मैं मतदान करके ऐसा कर रहा हूं। हालांकि, जब यह सब काम करता है तो मैं चीजों को और भी तेज बनाने के लिए डब्ल्यूएस या सॉकेट.ओओ जैसी चीजों का उपयोग कर सकता हूं।

समस्या: प्रत्येक टैब अधिसूचना प्राप्त करता है। यहां तक ​​कि वह टैब जिसने इसे पहली जगह में उकसाया! (एक परिणाम के रूप, पहले से अद्यतन स्क्रीन अद्यतन हो जाता है)

मैं किसी भी तरह सर्वर की आवश्यकता टैब अनुरोध करने के टैब आईडी पता होना। याद रखें कि उपयोगकर्ता के पास 5 टैब खुले हो सकते हैं: यदि वे XYZ बदलते हैं, तो सभी टैब को अधिसूचना प्राप्त होनी चाहिए, जो वास्तव में इसे ट्रिगर करता है!

फिलहाल, मैं प्रत्येक अजाक्स अनुरोध के लिए वर्कस्पेस आईडी पास कर रहा हूं (उपयोगकर्ता लॉग इन हो सकता है, और एक ही समय में कई कार्यक्षेत्रों तक पहुंच सकता है)।

  • समाधान 1: प्रत्येक अनुरोध
  • समाधान 2 के लिए दोनों कार्यक्षेत्र आईडी और टैब आईडी संलग्न: केवल हर अनुरोध के लिए टैब आईडी का उपयोग करें। ऐप वर्डस्पेस आईडी को टैबआईडी से काम करेगा (जो जानता है कि यह किस वर्कस्पेस से संबंधित है)
  • समाधान 3: ????? (कुछ ऐसा जो मुझे याद आ रहा है?)

कोई विचार?

+2

मुझे समाधान 1 या समाधान 2 के साथ कोई समस्या नहीं दिखाई देती है। समाधान 1 के लिए AJAX अनुरोध वह समय होगा जो अधिक समय लेता है, एक अतिरिक्त मूल्य भेजने से बहुत अंतर नहीं होता है। समाधान 2 भी ठीक है, आप बस सर्वर पर भेजे गए डेटा की व्याख्या करेंगे। व्यक्तिगत रूप से, मैं समाधान 2 के साथ जाऊंगा। मैं यह भी सुनिश्चित करता हूं कि आप अपने AJAX अनुरोध (शायद एक एन्क्रिप्टेड टैब आईडी और गुप्त कुंजी) सुरक्षित करें और अनुरोध भेजे जाने के बाद सर्वर पक्ष पर तुलना करें –

+0

समाधान 2 के साथ समस्या यह है कि एक "समाप्त" टैब से बने अजाक्स कॉल विफल हो जाएंगे क्योंकि टैब अब सक्रिय नहीं है। इसमें "रोचक" साइड इफेक्ट्स हैं (देखें: अपने पीसी को निलंबित करें, इसे दोबारा खोलें, उस फॉर्म को सबमिट करें ... और नहीं, काम नहीं करेगा)।कम से कम समाधान 1 के साथ कॉल वास्तव में काम कर सकता है (हालांकि कार्यक्रम को परिवर्तन की अधिसूचना मिल जाएगी ...) – Merc

उत्तर

2

सर्वर को इस बारे में चिंता करने के बजाय कि कौन से टैब आपको परिवर्तन अधिसूचनाएं भेज सकते हैं, उस टैब में परिवर्तन हो सकता है जो अधिसूचना को अनदेखा करता है। इस मन के लिए आते हैं करने के लिए

दो तरीके:

  • सामग्री बदलने के बाद एक टैब समय की एक संक्षिप्त अवधि के लिए सभी सूचनाएं ingore होगा। (यह ठीक काम करेगा जब तक कि कई टैब पर परिवर्तन थोड़े समय में न हो।)
  • क्या टैब "परिवर्तन आईडी" बनाता है जो यह xyz में परिवर्तन के साथ सर्वर को भेजता है। प्रसारण परिवर्तन अधिसूचना में यह आईडी शामिल है और प्रेषण टैब इसे उस व्यक्ति के रूप में पहचानता है जिसे उसने भेजा है और इसे अनदेखा करता है।
+0

दूसरे विकल्प के लिए +1! – 11684

+0

दूसरा विकल्प तब तक ठीक काम करता है जब तक क्लाइंट "प्रसारण अनुरोध" शुरू करता है। हालांकि, क्लाइंट पूरी तरह से असंबंधित ऑपरेशन शुरू कर सकता है, और * सर्वर * पहले से ही बदलाव करने वाले किसी भी को छोड़कर सभी कनेक्टेड टैब के लिए संदेश ट्रिगर करना चाहता है। मुझे लगता है कि मेरे पास एक ऑपरेशन हो सकता है, थोड़ा, मुझे इसे _each_ अनुरोध के लिए याद रखना होगा। – Merc

0

आप window.onfocus & window.onblur घटनाओं के लिए एक वापस आने के साथ HTML5 Visibility API के साथ प्रयोग और पेज को अपडेट करते ही वह वर्तमान में दृश्यमान/सक्रिय है को दबाने सकता है।

+0

मुझे '404' मिल रहा है –

+0

@AdamLynch निश्चित – pawel

+0

आप मिस्ड अपडेट पुनर्प्राप्त करने के बारे में कैसे जाएंगे पृष्ठ निष्क्रिय था? यह वास्तव में बदसूरत हो सकता है जब क्लाइंट सोचता है कि पृष्ठ सर्वर की तुलना में किसी अन्य राज्य में है ... – 11684

संबंधित मुद्दे