2011-02-26 1 views
8

UIBinder에서 다음 코드를 사용하여 프로그래밍 방식으로 코드의 href 링크를 설정할 수 있습니다. 나는이 때GWT : UIBinder를 사용하여 앵커에 위젯을 포함하는 방법

<g:HTMLPanel> 
    <g:Anchor ui:field="link"> 
     <g:InlineLabel ui:field="firstName"/> 
     <g:InlineLabel ui:field="lastName"/> 
    </g:Anchor> 
</g:HTMLPanel> 

내가 얻을 :

ERROR: Found widget in an HTML context Element <g:InlineLabel ui:field='firstName'> (:7). 

가 어떻게 앵커 내부에 위젯을 추가 할 수 있습니다?

<a id="myAnchor"> 
    etc... 
    </a> 

을 그리고 다음 HREF을 설정하려면 코드에서 DOM을 조작,하지만 추한 : 이전에 내가 사용에 의존했습니다. 더 좋은 방법이 있습니까?

+0

왜 InlineLabel 위젯을 사용하고 있습니까? 대신 s 또는 유사한 요소를 사용할 수 없습니까? –

+0

@ Thomas- 프로그래밍 방식으로 업데이트해야하기 때문에 InlineLabels를 사용하고 있습니다. 인라인 라벨은 스팬으로 렌더링됩니다. –

답변

6

패널 (흐름 또는 수평)을 사용하고 패널에 클릭 핸들러를 추가하여 링크를 시뮬레이션하는 것이 더 좋습니다. 앵커, 버튼 및 유사한 위젯은 그 안에 하위 태그를 허용하지 않습니다.

+0

ClickHandler를 인라인 레이블에 직접 추가했습니다. 그렇지 않으면 Flow/HorizontalPanel을 FocusPanel에 추가해야합니다. 한숨, 쉬워야합니다. –

+0

Google 크롤러가 내 웹 사이트의 구조를 이해하지 못하기 때문에 gwt 웹 사이트에서 앵커 요소를 피할까봐 걱정됩니다. 앵커/하이퍼 링크가 위젯을 가질 수 있도록하는 것이 왜 그렇게 문제가됩니까? –

+0

@ DraškoKokić GWT는 페이지를 만드는 것이 아니라 응용 프로그램이라고 생각합니다. 그래서 그것은 검색 엔진을 신경 쓰지 않습니다. –

14

아래 클래스는 SimplePanel과 똑같이 작동하지만 (즉, 위젯을 넣을 수 있음) 'div'대신 'a'를 사용합니다. 위젯이 더 필요하다면 다른 위젯을 넣기 만하면됩니다.

import com.google.gwt.user.client.DOM; 
import com.google.gwt.user.client.ui.SimplePanel; 

public class Link extends SimplePanel { 
    public Link() { 
     super(DOM.createAnchor()); 
    } 

    private void setHref(String href) { 
     getElement().setAttribute("href", href); 
    } 

    private String getHref() { 
     return getElement().getAttribute("href"); 
    } 

    public void setTarget(String frameName) { 
     getElement().setAttribute("target", frameName); 
    } 
}