2013-07-25 7 views
3

У меня проблема с проектом с компонентом Gmap в Primefaces 3.5 Я использую JSF2.0. У меня есть эта команда кнопки, которые фильтрацию маркеров и наиболее важных обновлений mapFormКак обновить маркеры gmap в сетях p: gmap после обновления gmap новыми маркерами

<h:form id="epsFilterForm"> 
     <p:commandButton action="#{mapMB.filterProjects}" value="#{bundle['filter'] }" update=":mapForm" /> 
</h:form> 

mapForm:

<h:form id="mapForm"> 
<p:gmap id="googleMap" center="48.849988,2.3805715" zoom="11" type="TERRAIN" fitBounds="false" model="#{mapMB.advancedModel}" 
    widgetVar="wmap" style="width:1000px;height:700px;display: inline-block;" > 

    <p:ajax event="overlaySelect" listener="#{mapMB.onMarkerSelect}" /> 
    <p:gmapInfoWindow> 
     <p:outputPanel style="text-align:center;display:block;margin:auto:"> 
      <p:panelGrid columns="2" styleClass="InfoTable" > 

       <p:outputLabel value="#{bundle['ep.operation.name'] }" /> 
       <p:outputLabel value="#{mapMB.selectedEp.opName}" /> 
      </p:panelGrid> 
     </p:outputPanel> 
    </p:gmapInfoWindow> 
</p:gmap> 

MapMB - область - область Session populateAdvancedModel()

public void populateAdvancedModel(List<EP> eps) { 
    advancedModel = new DefaultMapModel(); 
    int count = 0; 
    Marker marker; 
    for (EP ep :eps) { 
     //advancedModel.addOverlay(new Marker(coord1, "Konyaalti", "konyaalti.png", "http://maps.google.com/mapfiles/ms/micons/blue-dot.png")); 
     System.out.println("Integer.toString(ep.getId()):"+Integer.toString(ep.getId())); 
     marker = new Marker(new LatLng( Double.parseDouble(ep.getLatitude()) , Double.parseDouble(ep.getLongitude()))); 
     marker.setTitle(Integer.toString(count)); 
     advancedModel.addOverlay(marker); 
     count++; 
    } 
} 

filterProjec ц()

public String filterProjects() { 
    //FilterMB filterMB = (FilterMB) JSFUtil.getManagedObject("filterMB"); 
    eps = EPDAO.filterEPs(client, architect, realizationType, state, selectedCert); 
    populateAdvancedModel(eps); 
    return null; 
} 

onMarkerSelect()

public void onMarkerSelect(OverlaySelectEvent event) { 
    Marker marker = (Marker) event.getOverlay(); 
    String markerTitle = marker.getTitle(); 
    selectedEp = eps.get(Integer.parseInt(markerTitle)); 
} 

Когда я загрузить страницу в первый раз все в порядке. Информационное (p: gmapInfoWindow) окно загружается и информация для переменной EP есть. Но когда я нажимаю кнопку команды в epsFilterForm (у которой есть некоторые поля ввода, которые я не размещал здесь), карта обновляется, и отфильтрованные маркеры есть, и они, очевидно, имеют заголовок, когда я наводил на них курсор, но событие overlaySelect не работает таким же образом. Я считаю, что когда страница загружается в первый раз, есть некоторый начальный скрипт, который помещает это поведение в маркеры, но когда я обновляю карту, этот начальный скрипт не запускается снова, и именно поэтому, когда я нажимаю на маркер и событие overlaySelect, У меня есть нулевой указатель Исключение в методе onMarkerSelect() (маркер равен null). ВАЖНО - это работает без проблем на локальном сервере, но когда я его развертываю в движке Google, он работает, как описано выше.

ответ

1

DefaultMapModel gmap (ссылка на атрибут 'model' в элементе p: gmap) не имеет надлежащей функциональности для очистки, в отличие от других объектов модели, например, например. EventModel из p: schedule.

Если вы предоставляете этот объект с помощью контроллера SessionScoped, даже если вы воссоздаете этот объект с нуля, по какой-то причине p: gmap сохраняет ссылку на первую предоставленную карту. Практически это означает, что все новые/обновленные объекты mapmodel не используются, кроме первого.

Итак, сложная точка gmap, которая будет обновляться (добавление/удаление маркеров, наложений и т. Д.), Заключается в том, что объект mapmodel должен быть извлечен из объекта RequestScoped.

Теперь, еще один вариант, будет повторяться через все маркеры. Вы можете найти похожие сообщения here. Таким образом, вы можете сохранить свой фоновый компонент как SessionScoped, но опять же, вы не должны создавать новый mapModel.

EDIT: У меня создается впечатление, что представление не обновляет маркеры, а не сама карта. Во всяком случае, решение такое же. Это просто, что иногда вы не можете отбрасывать область видимости компонента (например, получение информационного окна на overlaySelect), поэтому вы заканчиваете обновление маркеров

+0

Да, это именно то, как я его решаю. Извините, что я не обновил его. Я просто забыл. Итак, bean: @ ManagedBean @ RequestScoped public class MapMB ... и после каждой фильтрации я снова заполняю модель методом populateAdvancedModel(). Благодарим за ответ. – makkasi

+0

Добро пожаловать. Если вы считаете, что это правильное решение, вы должны принять ответ. – yannicuLar

0

Я использую событие onGeocode в проверке bean-компонента, если есть какие-либо загруженных маркеров. Удалите эти маркеры перед добавлением новых маркеров. Надеюсь это поможет.

public void onGeocode(GeocodeEvent event) { 

    try { 

     List<GeocodeResult> results = event.getResults(); 

     if (results != null && !results.isEmpty()) { 
      LatLng center = results.get(0).getLatLng(); 
      centerGeoMap = center.getLat() + "," + center.getLng(); 

      List<Marker> markers = geoModel.getMarkers(); 

      if (markers != null && markers.size() > 0) { 

       geoModel.getMarkers().removeAll(markers); 
      } 

      for (int i = 0; i < results.size(); i++) { 
       GeocodeResult result = results.get(i); 
       geoModel.addOverlay(new Marker(result.getLatLng(), result.getAddress())); 

      } 
     } 
    } catch (Exception e) { 
     logger.error("Could not update GMap from geoCode", e); 
    } 
} 
0

У меня подобная ситуация.На самом деле то, что я пытаюсь сделать, это обновить маркеры в gmap после отображения gmap. Как сказал @yannicuLar, mapModel извлекается один раз в начале, когда отображается карта. Позже обновление на картеМодель не отражается на карте.

Мое решение заключается в использовании функциональности primefaces для запуска выполнения javascript со стороны сервера.

В XHTML:

  var markers = []; 
      function clearMarkers() { 
       for (var i = 0; i &lt; markers.length; i++) { 
         markers[i].setMap(null); 
       } 
       markers=[]; 
      } 
      function addMarkers() { 
       for (var i = 0; i &lt; markers.length; i++) { 
        PF('yourMap').addOverlay(markers[i]); 
        } 
      } 

В стороне Java/сервера, в том месте, где вы должны обновить mapModel с LAT/LNG, добавляемыми код, как показано ниже:

Чтобы удалить маркеры :

RequestContext.getCurrentInstance().execute("clearMarkers()"); 

Предположим, у вас есть несколько марок, чтобы итеративно добавить все маркеры для маркера массива:

RequestContext.getCurrentInstance().execute("var currentMarker = new google.maps.Marker({ position:new google.maps.LatLng(" 
        + latitude + ", " + longitude 
        + "), map:PF('yourMap').getMap()});" 
        + "markers.push(currentMarker);"); 

Чтобы добавить маркеры на карту после того, как массив маркер заполняется:

RequestContext.getCurrentInstance().execute("addMarkers()"); 

Испытано и работает для меня.

Смежные вопросы