2016-08-30 2 views
0

Ich habe ein Label, das mehrfach in meiner Seite verwendet wird. Es funktioniert gut, bis ich versuche, das Etikett per Ajax zu aktualisieren. Ergebnis: Nur das erste Label wird aktualisiert. Ist es ein bekanntes Problem? Ich bin mir nicht sicher, da ich die JIRA-Seite nicht öffnen kann: https://issues.apache.org/jira/browse/wicket (Get Throbber alle Zeit). Ich benutze Wicket Version 7.3.0Aktualisieren Sie ein Etikett, das mehrere Male verwendet

 

    To reproduce this issue: 
    1. Add an label on your page (java part): 
    private final Label label; 
    .. 
    label = new Label("yourLabel", "Your Text"); 
    label.setOutputMarkupId(true); 
    add(label); 
    ... 
    1. Add your label multiple time (for e.g. 4 times) in your page (html part): 
    ... 
    <span wicket:id="yourLabel"/> 
    &ltspan wicket:id="yourLabel"/> 
    &ltspan wicket:id="yourLabel"/> 
    &ltspan wicket:id="yourLabel"/> 
    ... 
    2. Add event handler for e.g. the ajax event is UpdateEvent in your page (java part) 
    ... 
     @Override 
     public void onEvent(IEventevent) { 
      if (event.getPayload() instanceof UpdateEvent) { 
       //update your label 
       label.setDefaultModelObject("new Text"); 
       target.add(label); 

      } 
     } 

=> nur das erste Etikett wird aktualisiert. Ich habe eine Problemumgehung dafür, indem ich 4 verschiedene Instanzen von Etiketten mit demselben Textinhalt hinzufüge.

+0

1. Verwenden Sie das Modell, nicht "Ad-hoc" Label mit Text. 2. Mehrfachverwendung des gleichen Wickets: ID ist seltsam, ich bin überrascht, es funktioniert. 3. Add to target ale comoponets wollen aktualisieren –

+0

Re 2: Er läuft in der Deployment-Konfiguration, wo DebugSettings # componentUseCheck deaktiviert ist. – svenmeier

Antwort

1

Die Wurzel des Problems ist, dass Wicket-Komponenten nicht mehrfach verwendet werden sollen - eine Komponente repräsentiert ein einzelnes Element auf der Seite. Hinzufügen von vier verschiedenen Label-Objekte (Ihre Problemumgehung) ist korrekt.

Wenn die vier Beschriftungen immer den gleichen Inhalt haben, sich dieser Inhalt jedoch manchmal ändert, können Sie dies verdeutlichen, indem Sie den vier Beschriftungen ein schreibbares Zeichenfolgenmodell zuweisen. Hier einige Pseudo-Code:

IModel<String> labelModel = new Model<String>("Your Text"); 

label1 = new Label("label1", labelModel); 
label1.setOutputMarkupId(true); 
add(label1); 

label2 = new Label("label2", labelModel); 
label2.setOutputMarkupId(true); 
add(label2); 

... 

@Override 
public void onEvent(IEventevent) { 
    if (event.getPayload() instanceof UpdateEvent) { 
     //update your label 
     labelModel.setObject("new Text"); 
     target.add(label1); 
     target.add(label2); 
    } 
} 

Alternativ könnten Sie Dinge kapseln noch weiter durch eine Unterklasse von Label zu machen, die die onEvent Methode implementiert selbst und passt seine eigenen Text.

+0

Ok, das bedeutet, ich brauche immer noch mehrere Instanzen von Label (ähnlich wie die Problemumgehung). Wenn es wie geplant funktioniert, muss ich es akzeptieren. Danke für Ihre Informationen und hilft – user6608379

+0

Wenn dies Ihre Frage beantwortet, können Sie auf das Häkchen-Symbol klicken, um es als "akzeptiert" zu markieren: http://stackoverflow.com/help/someone-answers – boris