【问题标题】:Apache Wicket - refreshing ListView triggered from inside the ListViewApache Wicket - 从 ListView 内部触发的刷新 ListView
【发布时间】:2011-11-23 15:22:27
【问题描述】:

我得到了以下结构,它在 html 表格中显示可编辑的行

Panel
 + WebMarkupContainer - in HTML <tbody wicket:id="container">
   + ListView which for each item in the list does (in HTML this)
     + item.add(new PopTable1Row("Pop1Panel", popTable1Item, ComponentMode.EDIT));
       + PopTable1Row component contains
         + Form
           + some inputs and a 2 submit buttons (Save, Delete)

现在我想实现这一点,例如通过单击删除列表视图将像 AJAX 一样重新加载而不重新加载整个页面。 Delete 按钮从表中删除一行,所以一行应该会消失。

我通过使用 AjaxSelfUpdatingTimerBehavior 实现了重新加载 ListView:

WebMarkupContainer.add(new AjaxSelfUpdatingTimerBehavior(Duration.seconds(5)));

它每 5 秒刷新一次 listView。 好的,但现在我想刷新 onSubmit 中的列表视图,例如删除按钮。

这里的问题是:如何做到这一点?

我在onSubmit试过:

this.getParent().getParent().getParent().getParent().render();
this.getParent().getParent().getParent().getParent().renderComponent();

但两者都不起作用。

【问题讨论】:

  • 按钮是 Ajax 按钮?如果是这样,他们会得到一个传入的 AjaxTarget。只需将 WMC 添加到目标即可。

标签: ajax apache listview refresh wicket


【解决方案1】:

首先,您必须在您的 listView 中将 outputId 设置为 true。所以Wicket会为list标签生成一个id,需要ajax更新。

yourListView.setOutputMarkupId(true);

然后在您的 onSubmit 方法中告诉 Wicket 重新绘制列表。请注意,在示例中,保存按钮是 AjaxLink,但您可以使用其他组件。

AjaxLink<Void> dltBttn = new AjaxLink<Void>("yourButtonId") {
  public void onClick(AjaxRequestTarget target) {
    // your stuff

    if(target != null) {
      // tells wicket to repaint your list
      target.addComponent(yourListViewComponent); 
}
  }
}

【讨论】:

  • 谢谢!那行得通。还要感谢@bert。为了使这个答案完整,我的最终代码如下所示: target.addComponent(this.getParent().getParent().getParent().getParent());
  • 注入目标组件或将其定义为类中的成员变量并简单地通过名称调用它不是更容易吗?这样一来,无论何时添加或删除图层,您的应用都不会中断...
  • 还不错。我必须与之抗争。
  • 由于 dltBttn 位于列表视图中,在 populateItem() 调用期间创建,它所引用的列表视图自身可能尚未初始化。竞争对手会玩得开心的。
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
相关资源
最近更新 更多