【问题标题】:Wicket: Submit Form in a Panel from another PanelWicket:从另一个面板提交表单
【发布时间】:2014-09-30 06:56:55
【问题描述】:

我有一个包含 2 个面板(面板 a 和面板 b)的页面。我使用其中一个面板(面板 b)在表格中显示一些数据。我在此表中添加了一个表单和一些复选框。我的第二个面板(panal a)用于显示按钮。 我想通过按下面板a的按钮来提交面板b的表单,这样我就可以对选中的那些做一些事情。

我搜索了一下,我想我必须使用 ajax 提交链接。但我不明白我是如何得到我选中的行的。

页面标记:

<wicket:extend xmlns:wicket="http://wicket.apache.org">
   <div style="margin-top: 60px">
       <h2><span wicket:id="header"></span></h2>
       <div wicket:id="categoryButtonPanel"></div>
       <div wicket:id="categoryTablePanel"></div>
   </div>
</wicket:extend>

这就是我在面板 b (categoryTablePanel) 中添加复选框的方式:

Form form = new Form("form");
final List<Category> selectedCategorys = new ArrayList<Category>(); //my list where my selected rows are in
CheckGroup group = new CheckGroup("group", selectedCategorys);

DataView dv = new DataView("categoryList", dataProvider) {

      @Override
      protected void populateItem(Item item) {
          final Category category = (Category) item.getModelObject();
          final CompoundPropertyModel<Category> categoryModel = new CompoundPropertyModel<Category>(category);

          item.add(new Check("checkBox", item.getModel()));
          // some more binded rows
 }
};

标记:

<wicket:panel xmlns:wicket="http://wicket.apache.org">
<form wicket:id="form">
<span wicket:id="group">
<div class="table table-striped table-hover table-condensed" style="overflow: auto !important;" wicket:id="categoryTable">
        <table class="table table-striped">
            <thead>
                <th><input type="checkbox" wicket:id="selector">check/uncheck all</input></th>
            </thead>
            <tbody>
                <tr wicket:id="categoryList">
                    <td>
                        <input type="checkbox" wicket:id="checkBox" />
                    </td>
                </tr>
            </tbody>
        </table>
        <div wicket:id="paginator"></div>
    </div>
    </span>
</form>
</wicket:panel>

我实际上可以检查每一行,如果我在表单中创建一个普通按钮,我可以使用列表selectedCategorys 来处理数据。

现在我想在第二个面板 (categoryButtonPanel) 中添加一两个按钮来处理我的数据。但是怎么做呢?

【问题讨论】:

    标签: java ajax wicket


    【解决方案1】:

    只需使用此构造函数创建 AjaxSubmitLink 即可:

    AjaxSubmitLink(String id, Form&lt;?&gt; form)

    因此,您需要以某种方式将表单传递到另一个面板以将其添加到提交链接。就个人而言,我会将两个面板添加到一个大表单中。

    【讨论】:

    • 但是如果我将面板放入页面中,我也需要将CheckGroup 放入页面中。因为我必须将检查组添加到表单中。这意味着我也需要将我的列表放在那里。所以我需要将我的表单、组和选定的列表传递给我的面板。对我来说感觉不对。我不能以某种方式在我的AjaxSubmitLink 中获取选定的列表吗?
    • 为什么?选择将与表单一起显示在面板中。您唯一需要的是对表单的引用。您甚至可以使用表单在面板上创建getForm 方法并将结果传递给另一个面板
    • 我确实用一个表单包裹了我的两个面板,并在我的页面中创建了表单、selectedList 和我的检查组。我只将我的 selectedList 传递给我可以使用它的 Buttonpanel。
    【解决方案2】:

    为了交流,您可以查看检票口事件,IEventSinkIEvent&lt;T&gt;。您可以执行此面板 1 之类的操作:

    public void panel1methodCalledOnSubmit(Category payload) {
         send(getPage(), Broadcast.BREADTH, payload);
    }
    

    您可以在面板 2 上这样回复:

    @Override
    public void onEvent(IEvent<?> event) {
        if (event.getPayload() instanceof Category) {
            // Do something
        }
    }
    

    如果您还不知道它是如何工作的,那么在做 ajax 事情时这可能会有点棘手。查看this page 了解更多活动信息。

    RobAu 建议的设置更简单。您可以将面板替换为 FormComponent&lt;T&gt; 对象,以提高表单的泛化能力。

    【讨论】:

    • 谢谢!听起来很有趣,我想我会阅读更多关于此的内容。
    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    相关资源
    最近更新 更多