2016-05-10 2 views
0

У меня есть простая панель (сама панель является частью большей формы) с CheckGroup. Флажки в контрольной группе генерируются в компоненте просмотра списка. Мне нужно динамически изменять эту панель, и при каждом изменении мне нужно получить выбранные элементы. Код панели в основном выглядит следующим образом:Wicket CheckGroup Двуличность Ajax в модели контрольной группы

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); 

Теперь проблема, когда я нажимаю на флажок, два одинаковых объекта добавляются в selectedObjects список. И если я удалю AjaxFormChoiceComponentUpdatingBehavior, объекты не будут добавлены в список (что имеет смысл, потому что я не представляю форму на этом этапе).

Я не совсем уверен, как решить эту проблему, и лучшее решение, с которым я столкнулся, - это получить список и пройти через него, удалив дубликаты.

Кроме того, извините за заголовок, но я понятия не имею, как назвать эту проблему.

Вот небольшой пример, чтобы прояснить проблему: Допустим, группа проверка отображения этих объектов:

object 1 
object 2 
object 3 
object 4 
object 5 

Затем, когда я выбираю object 1 модели контрольной группы (= selectedObjects) будет выглядеть следующим образом:

object 1 
object 1 
+0

Вы добавляете в свою группу новый AjaxFormChoiceComponentUpdatingBehavior(), но если он существует, он выдаст ошибку. Вы можете попробовать group.addOrReplace (...) или добавить AjaxForm в повторяющееся представление (например, список объектов и использовать дочерний идентификатор). – Igoranze

+0

К сожалению, метод addOrReplace() может использоваться только для Компонентов, а не для Поведений , А поскольку обновляемая модель (selectedObjects) находится в CheckGroup, поведение обновления также должно быть добавлено в контрольную группу, не так ли? По крайней мере, так я понимаю этот механизм в калитки. –

+0

У вас есть стек? – Igoranze

ответ

0

Попробуйте

target.add(form);` 

или

target.add(group); 

или что-то подобное, в зависимости от вашего кода.

0

Вы можете попробовать следующую конструкцию, воссоздать контрольную группу, чтобы она была актуальной. Может быть, немного переборщить, но это должно сделать трюк.

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); 
      } 
     }); 
    } 
Смежные вопросы