2011-02-06 5 views
5

Soy un Wicket newb. Esto puede ser simplemente mi ignorancia sobre el ciclo de vida de Wicket así que por favor, ¡ilumíname! Según tengo entendido, los objetos Wicket WebPage se instancian una vez y luego se serializan. Esto me ha llevado a un punto de confusión, ver abajo.Wicket: ¿Dónde agregar componentes? ¿Constructor? ¿O en BeforeRender?

Actualmente tengo una clase de plantilla que pretendo subclase. He seguido el ejemplo de los documentos Wicket demostrando cómo reemplazar el comportamiento de la plantilla en la subclase:

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

     super.onBeforeRender(); 
} 

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

Subclase:

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

Esto funciona muy bien. Lo que no tengo claro son las "mejores prácticas" para esto. Parece que se llama a BeforeRender() en cada solicitud de la página, ¿no? Esto parece que habría mucho más procesamiento en una página si todo está en onforeRender(). Podría seguir fácilmente el ejemplo de los otros ejemplos de Wicket y agregar algunos componentes en el constructor que no quiero anular, pero luego dividí la lógica de componentes en dos lugares, algo que dudo en hacer.

Si agrego un componente que pretendo estar en todas las subclases, ¿debería agregarlo al constructor o onBeforeRender()?

Respuesta

10

Para los componentes que no son una Page, puede anular la nueva onInitialize de devolución de llamada para agregar componentes, que sólo se llama una vez después de la construcción, cuando el componente se ha añadido a la página (para que component.getPage() no devuelve null) .

Otra opción es usar addOrReplace() en lugar de add.

En cuanto a llamar a métodos anulados en un constructor, intente hacer eso en un Model o alguna otra devolución de llamada demorada. En su ejemplo la solución es mucho más sencilla:

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

El uso de un PropertyModel para recuperar el contenido de la etiqueta es mucho mejor que empujar el valor en la etiqueta.

4

Debe agregar componentes en el constructor como una regla para la que hay muy pocas excepciones. Aproximadamente, hay una fase para configurar la jerarquía (construcción) y una fase separada para representarla. No se recomienda (y a menudo se prohíbe) mezclar los dos.

+1

Gracias. Pero si no puedo mezclar los dos, ¿cuál es la forma recomendada de anular el comportamiento de la plantilla? Llamar a métodos anulados en un constructor es una mala práctica. – gmallett

+0

Eso sería una excepción entonces :-) – Eelco

0

El método onBeforeRender es útil para manejar la opción visible del componente o la gestión del modelo.

+2

mejor uso onConfigure() de devolución de llamada para estas necesidades –

Cuestiones relacionadas