2011-02-21 1 views
4

Wicket 1.4에서 부모 페이지의 태그에서 하위 페이지가 CSS 클래스를 변경하도록 허용하고 있습니다. 이 경우에 이상한 점은 대상으로하려는 태그가 인 경우 하위 페이지 마크 업을 래핑한다는 것입니다.wicket : child 태그를 페이지의 다른 구성 요소 아래에 중첩시킬 수 있습니까?

ParentPage.html

<div id="main" wicket:id="main"> 
    <wicket:child /> 
</div> 

ParentPage.java

public abstract class ParentPage { 

    private WebMarkupContainer main; 

    protected ParentPage() { 
    main = new WebMarkupContainer("main"); 
    add(main); 
    } 

    public void setClassAttr(String cssClass){ 
    main.add(SimpleAttributeModifier("class", cssClass); 
    } 
} 

ChildPage.html

<wicket:extend> 
    ... 
</wicket:extend> 

ChildPage.java

public class ChildPage extends Page {  
    ... 

    public ChildPage() { 
     super(); 
     ...  
     setClassAttr("specific-class-for-this-page"); 
    } 
} 
: 여기에 내가 뭘하려 단순화 싹둑입니다

... 자식의 HTML이 나타나기 때문에 폭발합니다.하지만 자바는로드되지 않습니다. (필자는 개찰구 제거하는 경우 : div#main에 ID와 자바 코드를, 모두 잘 있습니다.) 내가 아이에서 를 조작 할 부모에 태그가 실제로 wicket:child 태그를 감싸는 것을

참고. 다른 경우에는 내가 비슷한 것을했는데 원숭이에게 원하는 태그는 형제가되거나 그렇지 않으면 wicket:child 태그와 거리가 먼 경향이 있습니다.

정말하고 싶은 것은 부모가 클래스 속성을 변경하도록 허용하는 것입니다. 다른 방법이 있나요? 하위 페이지를 다른 Wicket 페이지 구성 요소 아래에 중첩시킬 수없는 이유는 무엇입니까?

+1

저는 여러분이 달성하고자하는 것을 이해하지 못합니다. ''를 사용한다면 적어도 두 개의 컴포넌트 클래스가 있어야합니다. – biziclop

+0

죄송합니다. 원래 그 세부 사항을 생략했지만 지금 추가했습니다. – peteorpeter

답변

3

첫째는, 실제로는하지만, 컨테이너 내부 <wicket:child> 퍼팅으로 속성을 설정과는 아무 상관이 없습니다.

이제 ChildPagePanel 인 경우, ParentPage의 코드는 어떻게 생깁니 까? 그것은 어딘가에 main.add(new ChildPanel())을 말하는 라인을 포함 할 것입니다. 이것이 main 구성 요소가 렌더링 할 때 자식 패널의 렌더링 메서드를 호출해야한다는 것을 알고있는 방법입니다.

그러나 상속과는 다릅니다. main 구성 요소는 <wicket:child>이 무엇을 해결해야하는지 알 수 없습니다. main 컨테이너를 투명하게 표시하면 Wicket은 부모 구성 요소 (즉, 페이지 구성 요소)에게이를 확인하고 렌더링하도록 요청합니다.

+0

아주 좋은 설명! 감사. – peteorpeter

0

동료가 수정 사항을 찾았습니다. wicket : child 태그에 대한 구성 요소를 "transparentResolver"로 만듭니다. 정확히 어떻게 작동하는지 명확하게 표현할 수있는 사람에게 +1 하시겠습니까? 모든

main = new WebMarkupContainer("main") { 
     private static final long serialVersionUID = 1L; 
     @Override 
     public boolean isTransparentResolver() { 
      return true; 
     } 
    }; 
    add(main); 
1

잘 작동합니다. 구성 요소에 개찰구가 있습니다 : id = "main"위의 작업을 수행하십시오.

ain = new WebMarkupContainer("main") { 
    private static final long serialVersionUID = 1L; 

    @Override 
    public boolean isTransparentResolver() { 
     return true; 
    } 
}; 

예외는 발생하지 않습니다.

7

위키 1.5에서 제거 된 것을 지적하고자합니다. 따라서 Wicket 1.5 이상을 사용하는 경우 WebMarkupContainer.isTansparentResolver() 대신 TransparentWebMarkupContainer 구성 요소를 사용합니다. 포스터와 같은 문제도있었습니다.나는 wicket : child 태그를 감싸고있는 div를 포함하고있는 div를 가지고 있고 그것을 표시해야하는 내용을 기반으로 너비 (Twitter Bootstrap fluid grid)를 조정합니다.

<div class="row-fluid"> 
    <div class="span3" wicket:id="sidebarPanel"></div> 
    <div class="span6" wicket:id="mainContentContainer"> 
     <wicket:child/> 
    </div> 
    <div class="span3" wicket:id="rightPanel"></div> 
</div> 

는 때때로 rightPanel가 완전히 숨겨 및 에 mainContentContainer 변경되지 않는 뷰포트를 차지하기 : 내 mainContentContainerTransparentWebMarkupContainer이다.

See here.

게시 주셔서 감사합니다. 나는이 게시물을 읽을 때까지 똑같은 문제를 겪었다.

0

나는

public abstract class ParentPage { 

아마 당신은 extends WebPage를 잊어 버렸습니다 ... (나는 1.4.22로 시도) 당신의 개찰구 사용량 (또는 적어도 코드 당신이 게시) 이상이라고 생각한다.

public class ChildPage extends Page { 

여기서 ParentPage을 확장하고 싶습니다. 예상 생성 된 최종 HTML 내 추천은

<div id="main" wicket:id="main" class="specific-class-for-this-page"> 
    <wicket:child> 
     <wicket:extend> 
      text 
     </wicket:extend> 
    </wicket:child> 
</div> 

"당신이 필요하지 않을 때 개찰구 요소에 대한 HTML ID를 사용하지 않는"있는 그대로

모든 작동합니다.

1

귀하의 하위 페이지가 상위 페이지를 확장한다고 가정합니다. 왜 부모 클래스의 생성자에 클래스 이름을 전달하지 않습니까?

public class ChildPage extends ParentPage {  
    public ChildPage() { 
    super("my-class"); 
    } 
}