【问题标题】:Wicket CheckGroup Ajax duplicities in check group model检查组模型中的 Wicket CheckGroup Ajax 重复
【发布时间】:2016-05-10 09:35:21
【问题描述】:

我有一个带有 CheckGroup 的简单面板(面板本身是更大形式的一部分)。检查组中的复选框在列表视图组件中生成。我需要动态更改此面板,每次更改时我都需要检索所选项目。面板的代码基本上是这样的:

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

【问题讨论】:

  • 您正在向您的组添加新的 AjaxFormChoiceComponentUpdatingBehavior(),但如果它存在,它将引发错误。您可以尝试 group.addOrReplace(...) 或者在重复视图上添加 AjaxForm(即 objectlist,并使用子 id 或其他东西)
  • 很遗憾,addOrReplace() 方法只能用于组件,不能用于行为。而且由于要更新的​​模型(selectedObjects)在CheckGroup中,所以更新行为也应该添加到checkgroup中,不是吗?至少这是我在检票口中理解这种机制的方式。
  • 你有堆栈跟踪吗?
  • 我没有遇到任何异常,我将在主帖中添加我的问题示例。
  • 请创建一个快速启动应用程序来演示该问题。例如。在 GitHub/BitBucket。

标签: java ajax wicket wicket-7


【解决方案1】:

这是检票口上的一个错误。我用的是7.1版,然后改到7.10版,问题就解决了!

【讨论】:

    【解决方案2】:

    试试

    target.add(form);`
    

    target.add(group);
    

    或类似的东西,取决于你的代码。

    【讨论】:

      【解决方案3】:

      您可以尝试以下构造,重新创建检查组以使其保持最新状态。也许有点矫枉过正,但它应该可以解决问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多