2011-02-06 7 views
5

나는 개찰구입니다. 이것은 Wicket 라이프 사이클에 대한 나의 무지 일 수 있으므로 저를 계몽하십시오! 내 이해 Wicket WebPage 개체를 한 번 인스턴스화 한 다음 serialize됩니다. 이것은 나를 위해 혼란의 지점으로 이끌었습니다, 아래를보십시오.개찰 : 구성 요소를 추가 할 위치는 어디입니까? 건설자? 아니면 BeforeRender?

현재 서브 클래 싱하려는 템플릿 클래스가 있습니다.

protected void onBeforeRender() { 
     add(new Label("title", getTitle())); 

     super.onBeforeRender(); 
} 

protected String getTitle() { 
     return "template"; 
} 

서브 클래스 :

protected String getTitle() { 
     return "Home"; 
} 

이 아주 잘 작동 나는 하위 클래스에서 템플릿의 동작을 재정의하는 방법을 보여 개찰구 워드 프로세서의 예를 따랐다. 나에게 명확하지 않은 점은이를위한 "우수 사례"입니다. onBeforeRender()가 페이지에 대한 모든 요청에서 호출 된 것 같습니다. 그렇지 않습니다. 모든 것이 onBeforeRender()에 있으면 페이지에서 수행되는 처리가 훨씬 더 많아지는 것 같습니다. 다른 Wicket 예제의 예제를 쉽게 따라 할 수 있으며 생성자에서 내가 겹쳐 쓰고 싶지 않은 몇 가지 구성 요소를 추가 할 수 있습니다. 그런 다음 구성 요소 로직을 두 곳으로 나눠서 주저합니다.

모든 하위 클래스에 포함하려는 구성 요소를 추가하는 경우 생성자 또는 onBeforeRender()에 추가해야합니까?

답변

10

.

또 다른 옵션은 add 대신 addOrReplace()을 사용하는 것입니다.

생성자에서 재정의 된 메서드를 호출하는 경우 Model 또는 다른 지연된 콜백에서이를 수행하십시오. 당신의 예에서이 솔루션은 훨씬 간단하십시오 PropertyModel 라벨의 내용을 검색하기 위해 사용

public abstract class BasePage extends WebPage { 
    public BasePage() { 
     add(new Label("title", new PropertyModel<String>(this, "title"))); 
    } 
    public abstract String getTitle(); 
} 

레이블에 값을 밀어보다 훨씬 낫다.

4

예외가 거의없는 규칙으로 생성자에 구성 요소를 추가해야합니다. 대략적으로, 계층 구조 (구성)를 설정하기위한 단계와이를 렌더링하기위한 별도의 단계가 있습니다. 이 두 가지를 혼합하는 것은 권장되지 않으며 종종 금지됩니다.

Page ( null을 반환하지 않습니다 component.getPage() 있도록) 구성 요소가 페이지에 추가되었을 때, 당신은 한 번만 건설 한 후 호출 할 구성 요소를 추가하는 새로운 onInitialize 콜백을 무시할 수없는 구성 요소의
+1

감사합니다. 그러나 둘을 섞어서 사용할 수 없다면 템플릿 동작을 재정의 할 때 권장되는 방법은 무엇입니까? 생성자에서 오버라이드 된 메소드를 호출하는 것은 나쁜 습관입니다. – gmallett

+0

그러면 예외가 될 것입니다 :-) – Eelco

0

onBeforeRender 메서드는 구성 요소의 표시 옵션 또는 모델 관리를 처리하는 데 유용합니다.

+2

이 필요를 위해 onConfigure() 콜백을 더 잘 사용하십시오 –

관련 문제