2016-05-10 5 views
0

Ich habe ein einfaches Panel (das Panel selbst ist Teil eines größeren Formulars) mit CheckGroup. Die Ankreuzfelder in der Prüfgruppe werden in der Listenansicht generiert. Ich muss dieses Panel dynamisch ändern und bei jeder Änderung muss ich die ausgewählten Elemente abrufen. Der Code der Platte sieht grundsätzlich wie folgt:Wicket CheckGroup Ajax-Duplikate im Checkgruppenmodell

CheckGroup<MyObject> group = new CheckGroup<MyObject>(ID, selectedObjects); 
ListView<MyObject> objectList = new ListView<MyObject>(ID, values) { 

    @Override 
     protected void populateItem(ListItem<MyObject> item) { 
      Check<MyObject> check = new Check<MyObject>(TIME_CHECK, item.getModel()); 
      Label l = new Label(TIME_LABEL, item.getModel()); 

      item.add(check); 
      item.add(l); 
     } 
} 
group.add(objectList); 
group.add(new AjaxFormChoiceComponentUpdatingBehavior() { 

     @Override 
     protected void onUpdate(AjaxRequestTarget target) { 
      System.out.println("Selected objects: "+selectedObjects.size()); 
     } 
    }); 
add(group); 

Nun, das Problem ist, wenn ich auf das Kontrollkästchen klicken, werden die zwei identische Objekte in die selectedObjects Liste hinzugefügt werden. Und wenn ich die AjaxFormChoiceComponentUpdatingBehavior entferne, werden keine Objekte zur Liste hinzugefügt (was sinnvoll ist, weil ich das Formular an dieser Stelle nicht absende).

Ich weiß nicht genau, wie ich dieses Problem lösen soll, und die beste Lösung, die ich mir ausgedacht habe, war, die Liste zu bekommen und sie durchzugehen, indem ich Doppelungen beseitige.

Auch, sorry für den Titel, aber ich habe keine Ahnung, wie dieses Problem benannt werden soll.

Hier ist ein kleines Beispiel, das Problem zu klären: Nehmen wir die Prüfgruppe diese Objekte anzeigt:

object 1 
object 2 
object 3 
object 4 
object 5 

Dann, wenn ich object 1 das Modell der Kontrollgruppe auswählen (= selectedObjects) wird wie folgt aussehen: Versuchen

object 1 
object 1 
+0

Sie fügen Ihrer Gruppe AjaxFormChoiceComponentUpdatingBehavior() hinzu, aber wenn es existiert, wird ein Fehler ausgegeben. Sie können versuchen, group.addOrReplace (...) oder fügen Sie das AjaxForm in einer wiederholten Ansicht (dh Objektliste, und verwenden Sie eine Kind-ID oder etwas) – Igoranze

+0

Leider kann addOrReplace() -Methode nur für Komponenten, nicht für Verhalten verwendet werden . Und da das zu aktualisierende Modell (selectedObjects) in der CheckGroup ist, sollte das Aktualisierungsverhalten auch zur Checkgroup hinzugefügt werden, oder? Zumindest verstehe ich diesen Mechanismus im Wicket. –

+0

Haben Sie einen Stacktrace? – Igoranze

Antwort

0

target.add(form);` 

oder

target.add(group); 

oder etwas Ähnliches, abhängig von Ihrem Code.

0

Sie können die folgende Konstruktion versuchen, die Checkgroup neu erstellen, so dass sie auf dem neuesten Stand ist. Vielleicht ein bisschen Overkill, aber es sollte den Trick machen.

private CheckGroup<MyObject> group; 
    private IModel<MyObject> selectedObjects; 


    public MyCurrentPanel() { 
     selectedObjects = new CompoundPropertyModel<MyObject>(new MyObject()); 
     group = createCheckGroup(); 
     group.setOutputMarkupId(true); 
     add(group); 
    } 

    public CheckGroup<MyObject> createCheckGroup() { 
    CheckGroup<MyObject> newGroup = new CheckGroup<MyObject>(ID, MyCurrentPanel.this.selectedObjects); 
    ListView<MyObject> objectList = new ListView<MyObject>(ID, values) { 
     @Override 
      protected void populateItem(ListItem<MyObject> item) { 
       Check<MyObject> check = new Check<MyObject>(TIME_CHECK, item.getModel()); 
       Label l = new Label(TIME_LABEL, item.getModel()); 
       item.add(check); 
       item.add(l); 
      } 
    } 
    newGroup.add(objectList); 
    newGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() { 
      @Override 
      protected void onUpdate(AjaxRequestTarget target) { 
       System.out.println("Selected objects: "+selectedObjects.size()); 
       CheckGroup<MyObject> updateGroup = createCheckGroup(); 
       updateGroup.setOutpurMarkupId(true); 
       MyCurrentPanel.this.group.replaceWith(updateGroup); 
       MyCurrentPanel.this.group = updateGroup; 
       target.add(MyCurrentPanel.this.group); 
      } 
     }); 
    }