2010-02-05 14 views
8

Mam AjaxPagingNavigator. Zasadniczo w pewnym stanie, lista, którą strony AjaxPagingNavigator są przeładowywane. Kiedy tak się dzieje, chcę renderować nawigator tylko wtedy, gdy lista zawiera więcej niż 1 stronę.(Wicket) Zmień widoczność podczas odpowiedzi ajax ajax

Czy ktoś wie, gdzie mogę dołączyć moduł obsługi, aby można było sprawdzić warunek widoczności w moim AjaxPagingNavigator i włączyć/wyłączyć widoczność, aby nawigacja była aktualizowana przez. ajax jest albo widoczny, czy nie?

Markup:

<div wicket:id="mainWrap"> 
    <div wicket:id="navigator"/> 
    <div wicket:id="listWrap"> 
     <div wicket:id="list><!-- here be content --></div> 
    </div> 
</div> 

Więc mam ajax wydarzenie, które odświeża "mainWrap", który odświeża "Navigator" wraz z "listy" i opakowań.

to wydarzenie, które uruchamia całość.

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: wiem, że mogę napisać

navigator.setVisibility(list.getPageCount() > 1); 

po utworzeniu nawigatora i po aktualizacji modelu, ale miałem nadzieję, że do hermetyzacji w podklasie AjaxPagingNavigator.

Odpowiedz

16

Bądź ostrożny z robieniem kosztownych obliczeń w zastąpionej isVisible metody, jak Wicket wezwie isVisible wiele razy na żądanie-nie licząc żadnych połączeń można nieumyślnie zrobienia.

Zazwyczaj najlepszym sposobem obejścia tego problemu jest przesłonięcie onConfigure i ręczne ustawienie flagi widoczności.

@Override 
void onConfigure() { 
    super.onConfigure(); 
    setVisible(isVisible() && someExpensiveToCalculateCondition); 
} 

onConfigure nazywa się tylko raz podczas przetwarzania żądania, i wezwał wszystkich składników, w tym tych, które są niewidoczne (podczas onBeforeRender jest wywoływana tylko dla widocznych elementów).

+0

Bardzo podoba mi się ta odpowiedź.Dziękuję za wskrzeszenie tego problemu w przyszłości :) –

+0

+1 - Ten był ratownikiem (zasługuje na dwa głosy w górę :). Ale dlaczego wywołanie "isVisible" w "onConfigure"? Używając przykładu Dmitrija, jeśli pierwszy ajax zwróci "false" dla "someExpensiveToCalculateCondition", a drugi zwróci "true", wierzę, że "isVisible" będzie fałszywe dla całego wyrażenia. –

+0

Eduardo, ten oczywiście zależy od użycia. Zwykle wywołuje on isVisible() w celu respektowania zmian widoczności gdzieś w łańcuchu onConfigure. – msparer

1

Minęło trochę czasu odkąd dotknął furtki, ale jeśli mnie pamięć nie myli:

Nie możesz nadpisać() metoda isVisible swojego „Navigator” obiektu, tak, że wyświetla tylko pod warunkiem, pragnienie?

np. coś

.addComponent(new AjaxPagingNavigator(...) { 
    @Override public boolean isVisible() { 
    return model.getFound().size() > 25; 
    } 
}); 
+0

Ha! Czuję się tak głupi. Tutaj przeglądam szalone zachowania, aby przywiązać i ustawić widoczność. Oy! BTW "return super.isVisible() && this.getPageable(). GetPageCount()> 1;" jest prawdopodobnie lepszy, ponieważ chcemy zapewnić, że jeśli ktoś inny doprowadzi nas do niewidzialności, szanujemy to. –

+2

Nie czuj się głupio ... kiedy tworzyłem aplikacje Wicket, spędzałem zazwyczaj dużo czasu szukając rozwiązań dla moich różnych problemów, a kiedy je znalazłem, były one prawie zawsze o wiele prostsze, niż się spodziewałem. –

+2

Wezmę to. Myślę, że programiści Wicket wykonali świetną robotę, ponieważ zazwyczaj gdy patrzę na problem, zdaję sobie sprawę, jak łatwo było go rozwiązać/naprawić i bardziej intuicyjnie, niż myślałem. – Matt

Powiązane problemy