(Wicket) Alterar a visibilidade durante a resposta ajax
Pergunta
Eu tenho um AjaxPagingNavigator. Basicamente em uma determinada condição, a lista das páginas AjaxPagingNavigator é recarregado. Quando isso acontece, eu só quero tornar o navegador quando a lista contém mais de 1 página.
Então, alguém sabe onde eu posso anexar um manipulador para que eu possa verificar se há uma condição de visibilidade em minha AjaxPagingNavigator e ativar / desativar a visibilidade de modo que quando o navegador é atualizado via. ajax é visível ou não?
Markup:
<div wicket:id="mainWrap">
<div wicket:id="navigator"/>
<div wicket:id="listWrap">
<div wicket:id="list><!-- here be content --></div>
</div>
</div>
Então, eu tenho um evento ajax que refresca "mainWrap", que atualiza o "navegador", juntamente com a "lista" e envolvimentos.
Este é o evento que desencadeia a coisa toda.
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
List foo = null; // do work to get list
model.setFound(found); // update the model (thus updating "list")
target.addComponent(mainWrap);
}
Edit: Eu sei que eu posso escrever
navigator.setVisibility(list.getPageCount() > 1);
depois de criar o navegador e depois de atualizar o modelo, mas eu estava esperando para encapsular que em uma subclasse de AjaxPagingNavigator.
Solução
Tenha cuidado com a realização de cálculos caros em um método isVisible
substituído, como Wicket chamará isVisible
várias vezes por pedido-sem contar todas as chamadas que você pode inadvertidamente fazer.
Normalmente a melhor maneira de fazer isso é para substituir onConfigure
e definir o sinalizador de visibilidade manualmente.
@Override
void onConfigure() {
super.onConfigure();
setVisible(isVisible() && someExpensiveToCalculateCondition);
}
onConfigure
é chamado apenas uma vez durante o processamento do pedido, e chamou para todos os componentes, incluindo aqueles que são invisíveis (enquanto onBeforeRender
só é chamado para componentes visíveis).
Outras dicas
Tem sido um tempo desde que eu toquei Wicket, mas se serve de memória:
Você não pode substituir o isVisible () de seu objeto "navegador", de tal forma que apenas apresenta sob a condição que você deseja?
por exemplo. algo como
.addComponent(new AjaxPagingNavigator(...) {
@Override public boolean isVisible() {
return model.getFound().size() > 25;
}
});