2010-02-25 23 views
10

मेरे पास ऑर्डर नामक एक पृष्ठ है और ऑर्डर डिस्प्ले नामक एक पृष्ठ है। जैसा कि उत्कृष्ट MVP tutorial में वर्णित है, मैं इतिहास (एक केंद्रीय ValueChangeListener के साथ) और एक "ईवेंट बस" हैंडलर प्रबंधक के साथ काम कर रहा हूं।पैरामीटर पास करने के लिए जीडब्ल्यूटी इतिहास का उपयोग करना?

मैं एक हैंडलर घटना है कि किसी को एक आदेश है, जो मूल रूप से OrderDetailPresenter बनाता है, में आदेश आईडी (जो ShowOrderDetailEvent में निहित है) से गुजरता है पर क्लिक करता है के लिए पंजीकृत है, और फिर History.newItem("orderDetails") कहता है।

इसमें कुछ प्रमुख नुकसान हैं: यह नव निर्मित इतिहास चरण यह नहीं जानता कि कौन सी ऑर्डर आईडी पास की गई थी। उदाहरण के लिए, यदि कोई ऑर्डर विवरण पृष्ठ बुक करता है (या फिर अपने ब्राउज़र में आगे जाता है), तो वे ' ऑर्डर विवरण के साथ एक खाली पृष्ठ मिलेगा।

तो मेरा सवाल है: क्या मुझे इसके बजाय History.newItem("orderDetails?id="+id) जैसे कुछ करना चाहिए, और फिर मेरे मूल्य परिवर्तन श्रोता में इतिहास टोकन का विश्लेषण करना चाहिए? यदि हां, तो क्या इस तरह से स्ट्रिंग में तर्कों को स्वरूपित करने और स्वरूपण के लिए एक सर्वोत्तम अभ्यास, एक एपीआई, या लाइब्रेरी है?

उत्तर

9

हां, यही आपको करना चाहिए। जहां तक ​​मुझे पता है, यह आसान बनाने के लिए कोई लाइब्रेरी नहीं है।

थोड़ा सा सलाह, हालांकि: यदि संभव हो, तो आपको ऐसी योजना का उपयोग करने से बचना चाहिए जिसके लिए आपको अपने इतिहास आइटम स्ट्रिंग में प्रतिशत भागने का उपयोग करना होगा। कारण यह है कि location.hashlocation.href समाप्त होता है, #%[email protected]%40 ब्राउज़र से ब्राउज़र में भिन्न होता है। उदाहरण के लिए, क्रोम #%[email protected]%40 देता है; फ़ायरफ़ॉक्स #<@@ देता है। location.hash को सेट करने से समान ब्राउज़र-विशिष्ट प्रभाव हो सकते हैं।

जीडब्ल्यूटी का इतिहास टोकन तंत्र location.hash पर निर्भर करता है और ब्राउज़र व्यवहार में इस अंतर को सामान्य नहीं करता है। अंत परिणाम यह है कि यदि आप कुछ ऐसा उपयोग करते हैं जिसके लिए प्रतिशत भाग निकलता है, तो आपको यूआरएल मिलेगा जिन्हें ब्राउज़रों में साझा नहीं किया जा सकता है - यह एक मुद्दा है यदि किसी अन्य पृष्ठ पर आप लिंक जेनरेट करना चाहते हैं जो आपके जीडब्ल्यूटी के भीतर किसी विशेष स्थान पर कूदें ऐप, या यदि आप उपयोगकर्ताओं को अपने जीडब्ल्यूटी ऐप के भीतर लिंक करने वाले यूआरएल साझा करने की उम्मीद करते हैं। (या जब अपने उपयोगकर्ता Chrome इंस्टॉल, फ़ायरफ़ॉक्स कि आपके webapp अंदर विशेष धब्बे की ओर इशारा से अपने बुकमार्क आयात करता है, और अचानक बुकमार्क के रूप में वे पहले किया था काम नहीं करते)

व्यामोह के लिए, मैं डाल से बचने चाहते हैं किसी भी ?, #, &, %, <, या > आपके इतिहास टोकन स्ट्रिंग में वर्ण। हालांकि, orderDetails/oid=12313378 जैसे तार ठीक और क्रॉस-ब्राउज़र होना चाहिए।

+0

असल GWT (स्पष्ट करने के लिए कि इस मुद्दे के बारे में मैं बात कर रहा हूँ लेकिन समान URL कई विभिन्न ब्राउज़रों में काम कर रही है, की बिल्कुल नहीं विभिन्न ब्राउज़रों में से प्रत्येक में इतिहास टोकन विधि काम होने के साथ काम कर रहा है संपादित) ब्राउज़र में मतभेदों को ध्यान में रखता है। यह यहां वर्णित कई अलग-अलग मुद्दों के आसपास भी काम करता है। तो आप किसी भी वर्णित वर्णों का उपयोग कर सकते हैं। यदि आप इसे देखना चाहते हैं, तो 'gwt-user.jar' (gwt 2.0) फ़ाइल में' com.google.gwt.user.client.impl.HistoryImpl 'कक्षाओं पर एक नज़र डालें। और यह डी/एन्कोडिंग भी करता है ताकि आप '@' में पास हो सकें और यह इसका ख्याल रखेगा। –

+0

बहुत अच्छा लगता है। मैंने नोटिस किया कि जीमेल वास्तव में यह भी करता है, अगर मैं उदाहरण के लिए लेबल पर क्लिक करता हूं, तो यूआरएल "... # इनबॉक्स/लेबलनाम" में बदल जाता है। वे URL नाम लेबल को एन्कोड करते हैं, इसलिए, मैं URL.encode और URL.decode के साथ ऐसा ही कर रहा हूं। – Epaga

+0

बस पूरा होने के लिए। यदि आप 'History.newItem (..)' का उपयोग करते हैं, तो आपको डीकोड/एन्कोड नहीं करना चाहिए, क्योंकि जीडब्ल्यूटी पहले से ही आपके लिए यह करता है। वास्तव में यदि आप ऐसा करते हैं, तो यह फ़ायरफ़ॉक्स के बारे में बताई गई समस्याओं का कारण बन सकता है। –

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