2010-03-18 4 views
5

의 레이아웃 계층 구조 외부에서 위젯을 정의하는 방법 이것은 첫 번째 게시물입니다. 누군가가 나를 도울 수 있기를 바랍니다.
UiBinder XML 레이아웃 파일에서 레이아웃 계층에 속하지 않고 별도로 위젯을 정의 할 방법을 찾고 있습니다. 여기에 작은 예입니다 :GWT - uibinder xml 파일

<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
xmlns:g="urn:import:com.google.gwt.user.client.ui"> 

<g:Label ui:field="testlabel" text="Hallo" /> 
<g:HTMLPanel>  
... 
</g:HTMLPanel> 

컴파일은 UI 때문에 실패 UiBinder 요소는 하나의 자식 요소를 기대하고있다.
자바 코드에서 나는 액세스하고 평소와 같이 라벨 위젯 바인딩 : 당신은 그리드 또는 FlexTable를 정의 할 때

@UiField Label testlabel; 

것은 예를 들어,이 유용 할 수 - 내가 내 테이블 헤더의 레이블을 정의 할을 프로그래밍 방식으로 코드 내에있는 XML 레이아웃 파일.

+1

무엇을하려고합니까? 예를 들어, testLabel을 표시하지 않으려면 CSS 규칙 설정이 "display : none"인 styleName을 지정할 수 있습니다. – aem

답변

2

죄송합니다 사전에

많은 감사, 더 수행 할 수 있습니다, UiBinder은 구문의 종류를 지원하지 않습니다. 그것에 대해 생각해보십시오 -이 위젯은 어디에 있습니까? DOM 트리에 추가해야합니까? 또한 컴파일러가이 코드를 사용하지 않는 것으로 정리해야하는지 여부를 알기 어렵게 만듭니다.

GWT 팀이 에 대한 맞춤 태그를 만들 때까지 기다려야합니다 (예 : DockLayoutPanel). 어쨌든 프로그래밍 방식으로 추가하는 것을 의미하는 동적 콘텐츠 용으로 설계 되었기 때문에 나는 FlexTable과 같은 기능을 기대하지는 않습니다.

0

UiBinder Dev Guide을 이해하는 것이 UiBinder 템플릿을 깨끗하게 구성하는 방법을 이해하는 열쇠입니다.

위젯을 만들고 처음에는 DOM에 넣지 않으려면 위젯 템플릿에서 전혀 언급하지 말아야합니다. 대신 UiBinder 템플릿과 함께 사용되는 Java 파일에서 템플릿을 만들어 템플릿에 정의 된 패널에 추가하십시오.

<g:HTMLPanel ui:field='container'>  
... 

을 그리고 당신의 자바 파일에 넣고 :

예를 들어, 템플릿에 넣고 난 당신과 더 배치 같은 특별한 동기 부여가있는 경우 확실하지 오전

@UiField HTMLPanel container; 
public MyWidget() { 
    initWidget(uiBinder.createAndBindUi(this)); 
    Label testLabel = new Label("hallo"); 
    // Do whatever you want to testLabel 
    container.add(testLabel); 
} 
0

uibinder 태그 아래에 두 개의 루트 위젯보다 어쨌든, 이것이 내가하는 방법이다.

uibinder 태그는 하나의 루트 위젯 만 허용하므로 루트 UI로 HTML UI 태그를 배치 한 다음 해당 태그 내에 여러 의사 루트 위젯을 쌓습니다.

다음 예제에서는 실제 root 위젯에 ui : field name이 없다는 것을 알 수 있습니다. 우리가 사용하려고하지 않기 때문입니다. 우리가 생각하는 한, 유효한 루트 위젯은 "tabLayout"과 "content"입니다.

파일 Hello.ui.xml :

<ui:UiBinder 
    xmlns:ui="urn:ui:com.google.gwt.uibinder" 
    xmlns:g="urn:import:com.google.gwt.user.client.ui"> 
    <g:HTML> 
    <g:TabLayoutPanel ui:field="tabLayout" ... > 
     blah ... blah 
    </g:TabLayoutPanel> 
    <g:VerticalPanel ui:field="content"> 
     blah .. blah 
    </g:VerticalPanel> 
    </g:HTML> 
</ui:UiBinder> 

템플릿 뒤에 자바 코드로 합성을 연장하지 마십시오. 모듈 입력 지점에서 가져온 클래스를 만들거나 모듈에서 직접 템플릿을 사용하십시오.

하나 이상의 루트 위젯이 필요한 여러 가지 이유가 있습니다.이 예제에서는 조건부로 '효과적인 루트 위젯을 "첨부 :

public class Hello 
    implements EntryPoint{ 

    private static HelloUiBinder uiBinder = GWT.create(HelloUiBinder.class); 

    interface HelloUiBinder 
    extends UiBinder<Widget, Hello>{} 

    @UiField TabLayoutPanel tabLayout; 
    @UiField VerticalPanel content; 

    @Override public void onModuleLoad() { 
    uiBinder.createAndBindUi(this); 

    if (condition1) 
     RootPanel.get().add(tabLayout); 
    else 
     RootPanel.get().add(content); 

    blah ... blah 
    } 
} 

그래서, 트릭은 전혀 실제 루트 위젯을 사용하지 않는 것입니다.

+0

-1 - "내부"위젯 중 하나를 사용하고 싶을 때마다 다른 모든 위젯을 만들어야하므로 - 메모리 낭비가 발생합니다. mr_room은 XML/HTML/UiBinder가 이런 식으로 사용되지 않는다는 것을 이해해야합니다. 나중에 추가 할 요소가 있다면 프로그래밍 방식으로 (jQuery와 같은 라이브러리를 참조하십시오. HTML 파일의 어딘가에 미래의 HTML 태그를 "넣지"말고 프로그램 적으로 추가해야합니다) 추출하거나 그것은 별도의 위젯/UiBinder 템플릿에. –

+0

div 태그는 얼마나 비쌉니까? –

+0

그것은 단지 * div 태그가 아닙니다. 위젯에 따라 많은 이벤트 핸들러, 복잡한 스키마 등이있을 수 있습니다.이 모든 것을 만들면 단지 일부만 사용할 수 있습니다 - IMHO, 그건 낭비입니다. –