2011-11-02 12 views
6

Mam formularz wicket, który zawiera wiele komponentów wejściowych TextField. Do większości tych danych wejściowych dołączony jest Validator.Czy można zwrócić błąd sprzężenia zwrotnego, ale nadal zezwalać na aktualizację modeli komponentów?

Załóżmy, że wprowadziłem 50 wartości, a jedno z nich nie działa z funkcją sprawdzania poprawności zakresu. Wicket generuje komunikat o błędzie, ale nie aktualizuje modeli powiązanych z każdym komponentem. Rezultat jest taki, że tracę wszystkie 50 wartości, które właśnie wprowadziłem, i muszę je ponownie wpisać.

Moje pytanie brzmi, czy mogę powiedzieć Wicket, aby zaktualizować modele tych składników, które miały prawidłowe wartości, ale tylko zgłosić błąd dotyczący złej wartości?

Kopiąc w ramce, zauważyłem ten fragment kodu w FormComponent, który wydaje się wskazywać, że jeśli wystąpił błąd, nie aktualizuj modelu.

Czy istnieje sposób dostosowania tego zachowania i osiągnięcia mojego celu zachowania wszystkich prawidłowych wartości?

+1

Jakiego rodzaju weryfikatorów używasz? Wprowadzanie przez użytkownika powinno być zachowane, nawet jeśli występują błędy sprawdzania poprawności. Czy możesz pokazać jeden z tych weryfikatorów, w jaki sposób jest on przypisany do 'FormComponents' i w jaki sposób jest obsługiwane przetwarzanie formularzy? –

Odpowiedz

7

Założę się, że tutaj w ogóle nie ma nazwy FormComponent.processInput(). Po wysłaniu Form, Form.process() zostaje wywołana. Tam zadzwoni pod numer Form.validate(), który z kolei wywoła Form.validateComponents(), ostatecznie używając FormComponent.validate().

Problem, który masz tutaj, to globalna obsługa w Form.process(). Formularz składa się w całości lub wcale. Po niepowodzeniu FormComponent.validate(), Form.hasError() zwróci true, a zatem Form.process() nigdy nie zaktualizuje żadnego z modeli.

mogli Państwo:

  • przenieść wszystkie FormComponent niezależne weryfikacje do FormValidator. Tam możesz wybrać aktualizację modeli tych FormComponents, które przekazują ich walidacje.
  • Implementacja Form.onError() i skorzystaj z gościa, aby zaktualizować modele ważnego FormComponents.
  • Zastąp Form.process() i zmodyfikować gałąź // If a validation error occurred użyć własnych metod, aby zaznaczyć komponenty za ważne/nieważne i aktualizacji (lub nie) Model obiektów, w zależności od FormComponent o błędach. FormComponent.hasErrorMessage() powie Ci, czy sprawdzanie poprawności nie powiodło się dla określonego FormComponent.

UPDATE

Po omówieniu powody wprowadzania danych przez użytkownika zostało utracone z PO, okazało się, że FormComponents były dodawane w ListView które nie mają setReuseItems zestaw do true. To spowodowało, że FormComponents zostało stworzone od nowa na każdym ListView.populateItem(), tracąc w ten sposób wszystkie dane wprowadzone przez użytkownika.

Więcej informacji na temat charakteru tego problemu można znaleźć here:

Istnieje jednak kilka przepisów trzeba zadbać o podczas korzystania repeater w formularzu.Zwykle repeatery usuwają swoje przedmioty na początku każdego żądania, gdy w formularzu jest to zwykle niepożądane, ponieważ chcesz zachować stare przedmioty, ponieważ chcesz je zachować, a nie być odtworzone świeżo.

Na przykład, jeśli używasz ListView, powinieneś zadzwonić pod numer ListView.setReuseItems (true) wewnątrz formularza, aby zachować stare elementy zamiast zawsze tworzyć nowe za każdym razem.

+0

Powinienem wspomnieć, że strona tutaj jest DynamicWizardStep. –

+0

Nie użyłem czarodziejów, ale nie sądzę, żeby to miało znaczenie. Zostanie on dołączony do '

', czyż nie? –

+0

Tak, to będzie Xavi, ale jest to rodzaj ukrytego, co chyba jest intencją użycia DynamicWizard (rozszerzenia wicket). –

Powiązane problemy