2011-12-15 14 views
5

मुझे प्राइमफेस के साथ समस्या है जिसका संस्करण 3.0.एम 3 है। मैंने जीएमएपी और प्राइम पी का इस्तेमाल किया: AJAX.मैं कुछ ऐसा करना चाहता था जब मार्कर पर क्लिक किया जाए जब मार्कर पर किसी उपयोगकर्ता द्वारा मार्कर पर क्लिक किया जाता है।प्राइमफेस के साथ नलपोइंटर जीएमएपी ओवरले चयन करें

यहाँ कोड

<p:tabView effect="slide" effectDuration="normal" style="width:1050px;height:450px" > 
      <p:tab title="blabla"> 
       <h:panelGrid colums="1">  
       </h:panelGrid> 
      </p:tab> 
      <p:tab title="blabla" > 
       <h:panelGrid colums="1"> 
        <h:form id="mapId"> 

         <p:gmap id="asd" center="39.000409,35.201554" 
          zoom="#{mapBean.modelMap.zoomLevel}" 
          type="ROADMAP" 
          style="width:1000px;height:400px" 
          model="#{mapBean.emptyModel}" 
          widgetVar="map" > 

          <p:ajax event="overlaySelect" listener="#{mapBean.onMarkerSelect}"/> 

         </p:gmap> 

        </h:form> 
       </h:panelGrid> 
      </p:tab></p:tabView> 

है और मेरे ManagedBean

public void onMarkerSelect(OverlaySelectEvent event) { 

    Marker marker = (Marker) event.getOverlay(); 
    if (marker!=null) { 
     System.out.println(marker.getId()); 
    } 
    System.out.println("Clicked"); 
    modelMap.setZoomLevel(modelMap.getZoomLevel()+1); 

} 

प्रबंधित बीन घोषणाएं

@ManagedBean(name="mapBean") 
@RequestScoped 
public class MapBean implements Serializable 

मैं onMarkerSelect विधि में NullPointerException ले रहा हूँ। (event.getOverlay();)

+0

क्या आपने एम 4 या आरसी 1 में अपग्रेड करने का प्रयास किया है? – spauny

+0

मुझे एक ही समस्या है। – Simeon

+0

कई प्राइमफेस संस्करण (सभी 3.1 से 3.3 तक) का प्रयास किया है, मुझे उन सभी के साथ एक ही समस्या है। – Simeon

उत्तर

6

मेरी समस्या फिक्स्ड।

public MapModel getModel() { 

    final MapModel mapModel = new DefaultMapModel(); // this should be a field 

    final Set<MapEventDto> events = service.loadEvents(); 
    for (MapEventDto event : events) { 

     final double latitude = event.getLatitude().doubleValue(); 
     final double longitude = event.getLongitude().doubleValue(); 
     final String magnitude = event.getMagnitude().toString(); 

     final String title = "Id: " + event.getId() + ", Lat: " + latitude + ", Lng: " + longitude + ", Mag: " + magnitude; 

     mapModel.addOverlay(new Marker(new LatLng(latitude, longitude), title)); 

    } 
    return mapModel; 
} 

पूरे mapModel के बाद नक्शा प्रदान की गई है कचरा एकत्र किया जा सकता है (जैसा कि अब जरूरत है):

समस्या यह है कि जब MapModel बनाया गया था यह एक स्थानीय वार था। तो जब ओवरले ईवेंट कहा जाता है तो वहां कोई mapModel नहीं होगा।

जैसे ही मैंने mapModelBean का एक क्षेत्र बनाया, समस्या गायब हो गई।

+0

यदि कोई और इसका परीक्षण भी कर सकता है तो मैं बहुत आभारी हूं। – Simeon

+2

जेएसएफ में सामान्य नियम यह है कि गेटर्स/सेटर्स ** ** ** * काम करने के अलावा कुछ और नहीं कर सकते हैं, जिनके लिए उनका नाम है: संपत्ति प्राप्त करना और सेट करना। डेटा तैयार करना (पोस्ट) कन्स्ट्रक्टर या ए (एक्शन) श्रोता विधि या गेटटर में उच्च आलसी लोडिंग में किया जाना चाहिए। यह भी देखें http://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple- टाइम्स – BalusC

3

निम्नानुसार static फ़ील्ड का उपयोग करें। यह मेरे लिए काम किया।

final static MapModel mapModel = new DefaultMapModel(); 
+0

अंगूठे के नियम के रूप में, स्थिर फ़ील्ड को राज्य का प्रतिनिधित्व नहीं करना चाहिए, क्योंकि आप बहुत सारे सिर दर्द के लिए मार्ग प्रशस्त करते हैं । – Simeon

0
final DefaultMapModel mapModel = new DefaultMapModel(); 

इस के माध्यम से के रूप में ग्लोबल चर के लिए काम किया सबसे अच्छा वीजे

0

गॉट viewScoped में, और, अनुरोध स्कोप के बजाय ViewScoped को बीन के लिए गुंजाइश बदलकर हल तो यह उपयोगकर्ता गतिविधि के दौरान रहता है ।

कोई अंतिम/स्थिर declarators

@ManagedBean(name="mapBean") 
    @ViewScoped 
    public class MapBean implements Serializable { 
    private MapModel draggableModel; 
    ... 
    } 
0

जरूरत बस को @SessionScoped या @ViewScoped तो अपने सेम प्रत्येक अनुरोध के लिए आरंभ नहीं किया जा जाएगा अपने सेम गुंजाइश बदल जाते हैं।

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