2011-04-10 3 views
1

JSNI를 사용하여 응용 프로그램 내에서 Google Map을 표시하려고합니다. 내 index.html 페이지에서 스크립트를 정의했습니다.GWT : JSNI 함수 호출 getElementById() Null을 반환합니다.

다음
<g:HTMLPanel ui:field="mapboxV3ContentPanel"> 
    <!-- div for display of the actual map --> 
    <div id="map"><!-- --></div> 
</g:HTMLPanel> 

가 initializeMap() 기본 기능입니다 :

private native void initializeMap() /*-{ 

    var latLng = new $wnd.google.maps.LatLng(-34.397, 150.644); 
    var mapOptions = { 
     zoom: 8, 
     center: latLng, 
     mapTypeId: $wnd.google.maps.MapTypeId.ROADMAP 
    }; 
    var mapDiv = $doc.getElementById('map'); 
    if (mapDiv==null) { 
     alert("MapDiv is null!"); 
    } 
    var map = new $wnd.google.maps.Map(mapDiv, mapOptions); 
}-*/; 

불행하게도, mapDiv가 null 여기

은 (필수까지 냈다)을 uibinder 정의입니다. 밖에 도움이 필요 하신가요?

gwt-maps 및 gwt-maps-v3 프로젝트에 대해 알고 있습니다. 첫 번째 버전은 API의 v2 만 지원하며 gwt-maps-v3은 저에게 적합하지 않으므로 JSNI 방식을 사용합니다.

답변

3

원칙적으로 코드가 작동해야하며 빨리 테스트했습니다 (단, Google Maps API와 관련이 없어야 함).

유일한 중요한 것은 initializeMap()으로 전화하기 전에 문서에 <div id="map">을 추가하는 것입니다. 그 시점에서, 위젯이 아직 문서에 첨부되지 않기 때문에 당신이 MyUiBinderWidget의 생성자 내부에서 initializeMap()를 호출 할 수있는, 특히

@Override 
public void onModuleLoad() { 

    RootPanel.get().add(new MyUiBinderWidget()); // your widget with the map div 
    initializeMap(); 
} 

참고 :

다음을 시도하십시오 .

+1

@ Jason :'initWidget (...) '바로 뒤에'initializeMap()'을 넣는 것이 너무 빠르며 작동하지 않습니다. (내 대답에 추가 한 마지막 단락을 참조하십시오.) –

+0

좋아, 너무 빨리 읽고 다른 의견을 삭제했습니다. 만약 내가 생성자에서 그것을 할 수 없다면, 그것을 할 수있는 가장 좋은 장소는 어디입니까? – Jason

+1

@ Jason : 제 생각에 가장 좋은 장소는 생성자에 대한 호출이 끝난 직후입니다. 그리고 위의 예제에서와 같이 위젯이 문서에 추가되었습니다. –

관련 문제