2016-09-28 8 views
7

मैं Google मानचित्र सेवा का उपयोग करने में सक्षम होने के लिए प्राइमफ़ेस घटक gmap का उपयोग कर रहा हूं। यह मेरे लिए ठीक काम करता है, लेकिन मुझे कोई समस्या है। जब कोई इंटरनेट कनेक्शन नहीं होता है, तो मेरा यूजर इंटरफेस पूरी तरह अवरुद्ध हो जाता है। क्या इंटरनेट कनेक्शन के मामले में gmap को प्रतिपादित नहीं करके, इस समस्या को हल करने का कोई तरीका है? यहाँकोई इंटरनेट कनेक्शन नहीं होने पर gmap को अवरुद्ध करने के लिए कैसे करें

<p:gmap id="geoGmap" widgetVar="geoMap" center="#{managedBean.centerGeoMap}" zoom="15" type="ROADMAP" model="#{managedBean.geoModel}" style="width:1000px;height:500px" streetView="false" disableDefaultUI="true" > 
    <p:ajax event="geocode" listener="#{managedBean.onGeocode}" update="@this" /> 
</p:gmap> 

और यह आयात करने के लिए स्क्रिप्ट है: यह मेरा कोड है

<script src="https://maps.google.com/maps/api/js?sensor=false" type="text/javascript" ></script> 
+0

आपके उपयोगकर्ता आपके एप्लिकेशन तक कैसे पहुंचते हैं? क्या यह इंट्रानेट पर है? –

+0

उपयोगकर्ता एंटरप्राइज़ नेटवर्क –

+0

के माध्यम से एप्लिकेशन तक पहुंचते हैं क्या आपका एप्लिकेशन उसी नेटवर्क से होस्ट किया गया है? –

उत्तर

6

जब कोई इंटरनेट कनेक्शन, मेरे यूजर इंटरफेस पूरी तरह से अवरुद्ध हो

है

यह एक जावास्क्रिप्ट त्रुटि के कारण होता है। जब आप ब्राउज़र के डेवलपर टूलसेट में जावास्क्रिप्ट कंसोल की जांच करते हैं तो आप इसे देख सकते हैं। इसे देखने के लिए क्रोम/एफएफ 23 +/आईई 9 + में एफ 12 दबाएं।

Uncaught ReferenceError: google is not defined

क्रोम में, आप एक स्टैक ट्रेस प्रकट कर सकते हैं। आप पहली पंक्ति क्लिक करते हैं, यह के रूप में नीचे दिखाया गया है HTML स्रोत में <p:gmap> द्वारा उत्पन्न स्क्रिप्ट को संदर्भित करता है (सफेद स्थान को मैन्युअल रूप से पठनीयता के लिए डाला):

<script id="geoGmap_s" type="text/javascript"> 
    $(function() { 
     PrimeFaces.cw('GMap', 'geoMap', { 
      id: 'geoGmap', 
      mapTypeId: google.maps.MapTypeId.ROADMAP, // <-- Here, 
      center:new google.maps.LatLng(...),  // <-- and here. 
      ... 
     }); 
    }); 
</script> 

देखो, इस इनलाइन स्क्रिप्ट चर google है जो भिन्नता के लिए कोशिश कर रहा है Google मानचित्र API जावास्क्रिप्ट फ़ाइल द्वारा विंडो स्कोप में रखा जाना चाहिए। हालांकि, जब कोई इंटरनेट कनेक्शन नहीं होता है, तो वह Google मानचित्र API जावास्क्रिप्ट फ़ाइल लोड करने में विफल रहता है और इसलिए विंडो स्कोप में कोई google चर नहीं होगा और इसलिए यह <p:gmap>-जनरेटेड स्क्रिप्ट एक त्रुटि फेंक देगी जिसमें कहा गया है कि परिवर्तनीय google अपरिभाषित है।

जब जावास्क्रिप्ट संदर्भ में एक अनचाहे त्रुटि होती है, तो जावास्क्रिप्ट निष्पादन कुल रुक जाएगा। दूसरे शब्दों में, शेष स्क्रिप्ट, जैसे कि अन्य प्राइमफ़ेस उपयोगकर्ता इंटरफ़ेस घटकों के लिए, जिनकी कार्यक्षमता जावास्क्रिप्ट पर अत्यधिक निर्भर करती है, को निष्पादित नहीं किया जाएगा। इससे आपका अवलोकन "मेरा यूजर इंटरफेस पूरी तरह से अवरुद्ध हो जाता है" का अवलोकन करता है।

तकनीकी रूप से, समाधान सीधे आगे है: <p:gmap> उस स्क्रिप्ट को निष्पादित करने का प्रयास नहीं करना चाहिए जब परिवर्तनीय google विंडो स्कोप में नहीं है।

public class YourGMapRenderer extends GMapRenderer { 

    @Override 
    protected void startScript(ResponseWriter writer, String clientId) throws IOException { 
     super.startScript(writer, clientId); 
     writer.write("if(window.google)"); 
    } 

} 

आदेश इसे चलाने के लिए पाने के लिए, यह रजिस्टर:

आदेश है कि प्राप्त करने के लिए, आप <p:gmap> की रेंडरर, GMapRenderer विस्तार करने के लिए, एक if (window.google) लिखने के लिए सीधे स्क्रिप्ट के शुरू करने के बाद की जरूरत है के रूप में faces-config.xml जहां <renderer-class> अपने विस्तारित रेंडरर वर्ग के FQN का प्रतिनिधित्व करता है में नीचे:

<render-kit> 
    <renderer> 
     <component-family>org.primefaces.component</component-family> 
     <renderer-type>org.primefaces.component.GMapRenderer</renderer-type> 
     <renderer-class>com.example.YourGMapRenderer</renderer-class> 
    </renderer> 
</render-kit> 

एक बार स्थापित है, यह नीचे के रूप में प्रदान की गई स्क्रिप्ट बदल जाएगा:

<script id="geoGmap_s" type="text/javascript"> 
    if (window.google) $(function() { 
     PrimeFaces.cw('GMap', 'geoMap', { 
      ... 
     }); 
    }); 
</script> 

दूसरे शब्दों में, समारोह केवल, जब window.google truthy है लागू किए जाएंगे, यानी जब google चर जावास्क्रिप्ट की खिड़की दायरे में उपलब्ध है।

जो जेएस त्रुटि से बचने और जेएस निष्पादन जारी रखने देना चाहिए।

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