2015-06-03 15 views
5

Ho un pulsante di anteprima. Quando l'utente premi l'anteprima, il modulo viene inviato in una nuova scheda per mostrare che un file pdf ha dati in forma. Io uso un SubmitLink personalizzato per farlo SubmitResourceLinkLa pagina Wicket viene aggiornata se si utilizza ajax dopo che il modulo è stato inviato con target = _blank

public abstract class SubmitResourceLink extends SubmitLink implements IResourceListener { 
private final IResource resource; 

@Override 
public final void onResourceRequested() { 
    Attributes a = new Attributes(RequestCycle.get().getRequest(), RequestCycle.get().getResponse(), null); 
    resource.respond(a); 
} 

implementare su modulo

new SubmitResourceLink("previewBtn", form, new JasperReportsResource() { 
     private static final long serialVersionUID = -2596569027102924489L; 

     @Override 
     public byte[] getData(Attributes attributes) { 
      return control.getExportPreviewByteStream(estimateModel.getObject()); 
     } 
    }) { 
     private static final long serialVersionUID = 1L; 

     @Override 
     protected String getTriggerJavaScript() { 
      String js = super.getTriggerJavaScript(); 
      js = "document.getElementById('" + form.getMarkupId() + "').target='_blank';" + js; 
      return js; 
     } 

     @Override 
     public void onSubmit() { 
      form.add(AttributeModifier.append("target", Model.of("_blank"))); 
      processInputs(form); 
      onResourceRequested(); 
     } 
    }.setDefaultFormProcessing(false); 

Quando si preme anteprima, una nuova scheda è aperto nel mese. Ma quando inserisco in qualsiasi componente ajax (es: AutoCompleteTextField), xml restituisce dati xml: <ajax-response><redirect>....</redirect></ajax-response> e aggiorna pagina. Ora, dopo l'anteprima della stampa, utilizzo ancora la forma corrente. Grazie.

risposta

1

Ciò è causato dalla "protezione della pagina obsoleta" in Wicket. Il primo clic apre la stessa istanza di pagina in una nuova scheda/finestra. Questo incrementa il contatore della pagina renderCount, ad esempio "questa pagina è stata visualizzata N volte".
I collegamenti in Wicket sembrano ?2-1.ILinkListener-component~path. Qui '2' è l'id della pagina e '1' è il conteggio del rendering della pagina. Quindi i collegamenti in tab1 hanno renderCount 'N', e i collegamenti in tab2 - 'N + 1'.
Se si fa clic su un collegamento in tab1, con StalePageException viene segnalato che Wicket "sta tentando di utilizzare una versione obsoleta della pagina. Si prega di eseguire il rendering della versione più recente della pagina in modo che l'utente possa riprovare".

Questa protezione è necessaria perché l'utente può eseguire molte azioni in tab3, ad es. sostituire un pannello che sostituisce/nasconde il collegamento che l'utente desidera fare clic in tab1. Se non esiste tale protezione, Wicket fallirà con ComponentNotFoundException mentre si tenta di fare clic sul collegamento o, ancora peggio, si può fare l'azione sbagliata se il link/pulsante si trova in un ripetitore e il ripetitore ha cambiato gli elementi in tab2.

Per superare il problema si dovrebbe aprire una nuova pagina istanza in Tab2, vale a dire si invia il modulo, ma in onSubmit() fa qualcosa di simile setResponsePage(getPage().getClass()). In questo modo non eseguirà nuovamente il rendering dell'istanza attuale N + 1 della pagina.

+0

Grazie per anwser. Capisco perché wicket lo fa. Ma non so come risolvere il mio problema. – luanvu

+0

L'utilizzo di una finestra popup è un'opzione? Sarebbe molto più semplice dell'apertura di una nuova scheda. Dovrebbe essere qualcosa come: SubmitLink # setPopupSettings (...) –

Problemi correlati