(Wicket) modificare la visibilità durante la risposta ajax
Domanda
Ho un AjaxPagingNavigator. Fondamentalmente una certa condizione, la lista delle pagine AjaxPagingNavigator viene ricaricato. Quando questo accade voglio solo rendere il navigatore quando l'elenco contiene più di 1 pagina.
Quindi, qualcuno sa dove posso allegare un gestore in modo che possa verificare la presenza di una condizione di visibilità nel mio AjaxPagingNavigator e abilitare / disabilitare la visibilità in modo che quando il navigatore viene aggiornato via. ajax è visibile o no?
Markup:
<div wicket:id="mainWrap">
<div wicket:id="navigator"/>
<div wicket:id="listWrap">
<div wicket:id="list><!-- here be content --></div>
</div>
</div>
Così ho un evento ajax che rinfresca "mainWrap", che rinfresca il "navigatore" insieme alla "lista" e involucri.
questo è l'evento che fa scattare il tutto.
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: So che posso scrivere
navigator.setVisibility(list.getPageCount() > 1);
dopo aver creato il navigatore e dopo l'aggiornamento del modello, ma speravo di incapsulare che in una sottoclasse di AjaxPagingNavigator.
Soluzione
Fare attenzione con il fare i calcoli costosi in un metodo isVisible
override, come Wicket chiamerà isVisible
più volte per richiesta-senza contare tutte le chiamate si potrebbe inavvertitamente fare.
In genere il modo migliore per andare su questo è quello di ignorare onConfigure
e impostare manualmente il flag di visibilità.
@Override
void onConfigure() {
super.onConfigure();
setVisible(isVisible() && someExpensiveToCalculateCondition);
}
onConfigure
viene chiamato solo una volta durante l'elaborazione delle richieste, e ha chiesto per tutti i componenti, compresi quelli che sono invisibili (mentre onBeforeRender
viene chiamato solo per i componenti visibili).
Altri suggerimenti
E 'stato un po' da quando ho toccato Wicket, ma se la memoria non serve:
Non è possibile sostituire il metodo IsVisible () del vostro oggetto "navigatore", in modo tale che viene visualizzato solo sotto la condizione che si desidera?
es. qualcosa come
.addComponent(new AjaxPagingNavigator(...) {
@Override public boolean isVisible() {
return model.getFound().size() > 25;
}
});