2017-06-27 2 views
-1

Mehrere Seiten können aktuelle und historische Daten/Konfigurationen anzeigen. Wir möchten, dass der Benutzer die Menge der angezeigten historischen Daten steuern kann. Eine Einstellung dafür ist in der Sitzung; Die Einstellung wird einer Einstellungsseite und der Datenbank hinzugefügt. Unsere bevorzugte Methode zur Durchführung einer On-the-Fly-Anpassung ist die Verwendung eines DropDownChoice-Steuerelements auf der Basisseite.Wie kann ich erzwingen, dass eine Seite innerhalb von onSelectionChanged erneut gerendert wird?

Ich erstellte Modell- und Entitätsklassen innerhalb meiner BasePage-Klasse, um diese Werte zu verarbeiten.

private Integer setting; 
private String description; 

Der Code für die DropDownChoice Steuerung:

private TermSettingEntity tsetting; 

private void buildCommon() 
{ 
    // Number of prior terms to show 
    tsetting = new TermSettingEntity(AlphPlusSession.get().getDateRange(), "dummy"); 
    TermSettingEntity[] toptions = new TermSettingEntity[] 
    { 
      new TermSettingEntity(0, "Current Term"), 
      new TermSettingEntity(1, "One Prior Term"), 
      new TermSettingEntity(2, "Two Prior Terms"), 
      new TermSettingEntity(-1, "All Terms") 
    }; 
    ChoiceRenderer<TermSettingModel> choiceRenderer = new ChoiceRenderer<TermSettingModel>("description", "setting"); 
    DropDownChoice<TermSettingModel> prefselect = new DropDownChoice<TermSettingModel>("termPref", 
      new PropertyModel<TermSettingModel>(this, "tsetting"), Arrays.asList(toptions), choiceRenderer) 
    { 
     private static final long serialVersionUID = 1L; 

     public boolean isVisible() 
     { 
      // Show on the side panel 
      return allowPreference; 
     } 

     protected boolean wantOnSelectionChangedNotifications() 
     { 
      return true; 
     } 

     protected void onSelectionChanged(final TermSettingModel newSelection) 
     { 
      System.out.format("onSelectionChanged(%s)%n", newSelection.getSetting().toString()); 
      AlphPlusSession.get().setDateRange(newSelection.getSetting()); 
      setResponsePage(getPage()); 
     } 
    }; 
    prefselect.setNullValid(false); 
    prefselect.setRequired(true); 
    add(prefselect); 
} 

ich einen Sitzungswert in onSelectionChanged(..) geändert. Der Aufruf an setResponsePage(getPage()) verursacht die gleiche Antwort wie das Klicken auf eine Seitenaktualisierung: Die Tabellen werden mit den gleichen Daten neu ausgefüllt, aber es gibt keinen Datenzugriff, um mehr oder weniger Daten zu erhalten.

Gibt es eine Methode, um die gesamte WebPage neu zu erzwingen, einschließlich des erneuten Abrufs von Daten aus der Datenbank?

+0

Bitte lesen Sie [Wie stelle ich eine gute Frage?] (Http://stackoverflow.com/help/how-to-ask), bevor Sie versuchen, weitere Fragen zu stellen. –

+0

Wer die Antworten ablehnt, hinterlasse bitte Kommentare, warum. –

Antwort

0

Wäre toll, einige Details über die Komponente zu haben, die Ihre historischen Daten enthält und wie Sie sie erstellen.

Möglicherweise ist der schnellste Code Update: Statt setResponsePage(getPage()) Sie setResponsePage(getPage().getClass()) Dies zwingt eine neue Seite Instanz zu erstellenden nutzen könnten (wenn Ihre Seite muss PageParameters sie auch hinzufügen).

Reiniger: Wenn noch nicht geschehen, verwenden Sie Modelle, um Ihre Komponenten einzurichten. Ihre Komponenten sollten sich dann selbst aktualisieren. Siehe https://cwiki.apache.org/confluence/display/WICKET/Working+with+Wicket+models

+0

Das Hinzufügen des Aufrufs 'getClass()' löst mein unmittelbares Problem: Die ganze Seite wird neu konstruiert. Die Integration dieser Einstellung in den Rest des Systems (Konfigurationsseite, Datenbank) hat gerade erst begonnen. Es war hart genug, um die "DropDownChoice" überhaupt funktionieren zu lassen. – JoeAB

0

Nach onSelectionChanged() wird Ihre ganze Seite trotzdem gerendert, keine Notwendigkeit, mit setResponsePage() geige.

Ihre Komponenten halten veraltete Daten fest. Wie Benutzer5474918 vorgeschlagen hat, sollten Sie Ihren Code überarbeiten, um Modelle korrekt zu verwenden, z. statt

new Label("id", foo.getBar()) 

... ein Modell indirection verwenden:

new Label("id", new PropertyModel(fooModel, "bar")) 

Property ist nur eine von mehreren Lösungen dafür.

+0

Die Seite kann 'ListView # populateItem (..)' aufgerufen haben, führte aber 'List pastList = termService.getListOfPastTerms (institionId, AlphPlusSession.get(). GetDateRange());' im Konstruktor nicht aus. Mir ist nicht klar, wie ein "Label" auf das "DropDownChoice" -Steuerelement angewendet wird. – JoeAB

+0

Ein DropDownChoice funktioniert auch mit Modellen, rufen Sie einfach den richtigen Konstruktor auf: https://github.com/apache/wicket/blob/master/wicket-core/src/main/java/org/apache/wicket/markup/html/ form/DropDownChoice.java # L159 Damit wird sichergestellt, dass immer mit aktuellen Daten gearbeitet wird. – svenmeier

+0

Erwähnen Modelle immer noch meist verwirrt mich.Muss ich eine Modell-, Entity- und Renderer-Klasse erstellen, um einen "Integer" -Wert an (wahrscheinlich einsprachige) Anzeige "String's" anzupassen? – JoeAB

Verwandte Themen