2009-08-06 4 views
8

Hy, 위젯 템플릿의 특정 부분 (예 : div)을 특정 조건 (예 : 내가 채울 데이터가있는 경우에만)으로 표시하고 싶습니다. 문제는 다음과 같습니다.Wicket : 템플릿의 조건부 표시

데이터가있는 경우에만 패널 (div 채우기)을 추가하면 데이터가없는 페이지를 호출 할 때마다 예외가 발생합니다 (참조 된 wicket-id가 컴포넌트 트리).

데이터가 없다면 빈 패널을 추가하는 것이 내 마음에 온 유일한 해결책이었습니다. 이것은 이상적인 해결책이 아닙니다. 자바 코드에서 불필요한 코드를 얻었고 렌더링 된 HTML에서 많은 빈 div를 얻었 기 때문입니다.

따라서 위킷 템플릿의 여러 부분을 조건 하에서 만 포함시키는 것이 더 나은 해결책입니까?

답변

4

이 오래된 질문 하나 더 해결책이 될 수있다 여기에 있지만 : wicket:enclosure (및 this)

업데이트 : 지금은 (jetwick에 대한) 내 스스로가이 기능을 필요로했다. 나는 loggedIn 상태에 대한 WebMarkupContainer 하나를 사용하고 loggedOut 상태에 대한 하나의 오른쪽 가시성을 설정 해요 :

if (loggedIn()) {    
    WebMarkupContainer loggedInContainer = new WebMarkupContainer("loggedIn"); 
    //## do something with the user 
    User user = getUserSomeWhere(); 
    loggedInContainer.add(new UserSearchLink("userSearchLink")); 
    add(loggedInContainer); 
    add(WebMarkupContainer("loggedOut").setVisible(false)); 
} else { 
    add(new WebMarkupContainer("loggedIn").setVisible(false)); 
    WebMarkupContainer loggedOutContainer = WebMarkupContainer("loggedOut"); 
    loggedOutContainer.add(new LoginLink() {...}); 
    add(loggedOutContainer); 
} 
나를 위해 이것의 장점은 내가 // ## 표시된 라인과 묶으에 NullpointerExc을 방지한다는 것입니다

개찰구의 특징은 내 생각에 이보다 더 못 생겼을 것이다. 개찰구 워드 프로세서 (https://cwiki.apache.org/WICKET/lifecycle-of-a-wicket-application.html)에서

+0

고마워, 그게 좋은 해결책 같아! – theomega

+0

내 업데이트 된 답변보기 – Karussell

+0

@Karussell,'else' 바로 위에'new'가 누락 되었습니까? – aioobe

1

나는 이것이 EmptyPanel 인 이유라고 생각합니다. 당신의 코드에 대해 더 많이 알지 못하면 나는 당신이하고 있다고 생각하는 것이 단지 AbstractRepeaterFragment의 어떤 자식의 조합으로 할 수 있다고 말할 수 있습니다. 당신이하고 싶은 일에 대해 더 많이 이야기하고 싶다면 어쩌면 코드도 제공 할 수 있다면 최대한 많이 도와 드리겠습니다.

0

당신은 setVisible (false)를 호출 할 수 있습니다; 숨기려는 구성 요소에

3

@miaubiz와 마찬가지로 가시성이 다른 상태 (예 : 채워진 필드)의 조건 일 경우 setVisible (false)을 호출하거나 isVisible() 메서드를 재정의 할 수 있습니다.

2

그래, 당신은 isVisible을 재정의 싶습니다. 이렇게하면 isVisible = false html 마크 업이 렌더링에서 최종 html 페이지로 유지됩니다. 또한 문서 (EmptyPanel에 언급 됨)에 따라 WebMarkupContainer을 배치 구성 요소로 사용할 수 있습니다.

this.add(new SimpleResourceModelLabel(NO_DATA_LABEL){ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean isVisible() { return myList.isEmpty(); } 
    }); 

    final WebMarkupContainer table = new WebMarkupContainer(MY_DATA_TABLE){ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean isVisible() { return !myList.isEmpty(); } 
    }; 
+0

더 : Component.render는() 컴퍼넌트를 렌더링하기 위해 다음 단계에 따라 : 1. 구성 요소의 가시성을 결정합니다. 구성 요소가 표시되지 않으면 RequestCycle의 응답이 단순히 출력을 무시하는 Response 구현 인 NullResponse.getInstance(), 으로 변경됩니다. – jgormley