Wicket: exibição condicional no modelo
Pergunta
Hy, Eu quero mostrar uma certa parte (a div por exemplo) do meu postigo-template apenas sob uma determinada condição (por exemplo, só se eu tiver os dados para preenchê-lo). O problema é:
Se eu só adicionar o painel (enchendo o div) se eu tenho os dados, uma exceção é lançada a cada vez que eu chamo a página sem os dados (porque o postigo-id referenciado não é adicionado ao componente de árvore).
A única solução que me veio à mente foi adicionar um painel vazio se não houver dados. Esta não é uma solução ideal, porque eu tenho algum código desnecessária no código java e muitas divs vazios no meu html renderizado.
Então, há uma solução melhor para incluir várias partes de um postigo-template somente sob uma condição?
Solução
Embora esta é uma velha questão aqui poderia ser mais uma solução: postigo: gabinete (e este )
Atualizar : Agora eu precisava desta funcionalidade por minha auto (para jetwick ). Eu estou usando um WebMarkupContainer para o estado LoggedIn e um para estado loggedout e definir a visibilidade direita:
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);
}
A vantagem deste para mim é que eu evitar uma NullpointerExc no // ## linha marcada eo recurso enclose de postigo ficaria mais feia para mim, neste caso, eu acho.
Outras dicas
Como @miaubiz disse, você pode chamar setVisible (false), ou você pode substituir o método isVisible (), se a visibilidade é condicional para algum outro estado (campos preenchidos, por exemplo).
Sim, você deseja substituir isVisible. Isto irá manter o isVisible = false html marcação do mesmo renderização para a página html final. Além disso, de acordo com os documentos (indicado em EmptyPanel ), você pode usar o WebMarkupContainer como o componente de embrulho.
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(); }
};
Eu acho que é por isso que há EmptyPanel . Sem saber sobre o seu código mais só posso dizer que o que eu acho que você está fazendo é algo que eu faria com a combinação de alguma criança de AbstractRepeater e Fragmento . Se você está disposto a dizer mais sobre o que você quer fazer e talvez fornecer algum código também, eu vou ser feliz para ajudar tanto quanto eu puder.
Você pode chamar setVisible (false); sobre o componente que você deseja esconder.