2011-11-02 7 views
6

Ho una forma wicket che contiene molti componenti di input TextField. C'è un Validatore collegato alla maggior parte di questi input.È possibile restituire un errore di feedback, ma consentire comunque a wicket di aggiornare i modelli dei componenti?

Supponiamo di aver immesso 50 valori e uno di questi non ha un validatore di intervallo. Wicket genera quindi un messaggio di errore, ma non aggiorna i modelli associati a ciascun componente. Il risultato è che perdo tutti i 50 valori che ho appena inserito e devo reinserirli di nuovo.

La mia domanda è, posso dire a Wicket di aggiornare i modelli di quei componenti che avevano valori validi, ma basta segnalare un errore per il valore errato?

Scavando nel framwork, ho notato questo frammento di codice in FormComponent, che sembra indicare che se c'è un errore, allora non aggiornare il modello.

public final void processInput() 
{ 
    inputChanged(); 
    validate(); 
    if (hasErrorMessage()) 
    { 
     invalid(); 
    } 
    else 
    { 
     valid(); 
     updateModel(); 
    } 
} 

C'è un modo per personalizzare questo comportamento e raggiungere il mio obiettivo di mantenere tutti i valori validi?

+1

Che tipo di validatori stai utilizzando? L'input dell'utente deve essere mantenuto, anche se ci sono errori di validazione. Puoi mostrare uno di questi validatori, come è collegato a 'FormComponents' e come viene gestito l'invio del modulo? –

risposta

7

Scommetto che il numero FormComponent.processInput() non viene chiamato qui. Quando si invia il Form, viene chiamato il numero Form.process(). Lì, chiamerà Form.validate(), che a sua volta chiamerà Form.validateComponents(), in ultima analisi usando FormComponent.validate().

Il problema che si verifica qui è la gestione globale in Form.process(). Il modulo viene inviato completamente o non lo è affatto. Quando un FormComponent.validate() non riesce, Form.hasError() restituirà true e pertanto Form.process() non aggiornerà mai nessuno dei modelli.

Si potrebbe:

  • Spostare tutti FormComponent convalide indipendenti ad un FormValidator. Qui puoi scegliere di aggiornare i Modelli di quelli FormComponents che passano le loro convalide.
  • Implementare Form.onError() e utilizzare un visitatore per aggiornare i modelli di FormComponents valido.
  • Ignora Form.process() e modifica il ramo // If a validation error occurred per utilizzare i propri metodi per contrassegnare i componenti come validi/non validi e aggiornare (o meno) gli oggetti del modello, a seconda dello FormComponent con errori. FormComponent.hasErrorMessage() indicherà se la convalida non è riuscita su un determinato FormComponent.

UPDATE

Dopo aver discusso le ragioni per cui ingresso utente è stato perso con l'OP, si è scoperto che la FormComponents venivano aggiunti in un ListView che non hanno setReuseItems insieme a true. Questo causava la creazione di FormComponents su ogni ListView.populateItem(), perdendo quindi tutto l'input dell'utente.

Maggiori informazioni sulla natura di questo problema può essere trovata here:

Ci sono tuttavia alcune disposizioni che si deve prendere cura di quando si utilizza un ripetitore in forma.Di solito i ripetitori cancellano i loro articoli all'inizio di ogni richiesta, quando all'interno di un modulo questo è solitamente indesiderabile perché si desidera conservare gli elementi precedenti perché si desidera che lo mantenga il loro stato anziché essere ricreato fresco.

Per esempio, se si utilizza ListView, si dovrebbe chiamare ListView.setReuseItems (veri) all'interno del modulo in modo che conserva i vecchi articoli invece di crearne sempre di nuovi ogni volta.

+0

Avrei dovuto dire che la pagina qui è un DynamicWizardStep. –

+0

Non ho usato i wizard, ma non credo che faccia la differenza. Sarà incluso in un '

' comunque, non è vero? –

+0

Sì, sarà Xavi, ma è un po 'nascosto, che credo sia l'intento di usare il DynamicWizard (estensioni wicket). –