如何从Apache Wicket的另一个ListView刷新面板?

问题描述:

我有一个面板(说AlertPanel),需要刷新ListView呈现时的某些条件。如何从Apache Wicket的另一个ListView刷新面板?

我正在考虑更新onBeforeRender()的生命周期方法中的AlertPanel

我试图重写onBeforeRender()像这个 -

  @Override 
      protected void onBeforeRender() { 
       super.onBeforeRender(); 
       // update alert panel with some API of Component here 
       // I can get panel object like this 'this.getPage().get("alertPanel");' 
      } 

一旦我有this.getPage().get("alertPanel"),我不知道是什么的org.apache.wicket.markup.html.panel.Panel API调用,这样我可以刷新/重绘AlertPanel

+0

使用'replace'组件将为您工作。查看此链接https ://ci.apache.org/projects/wicket/guide/6.x/guide/componentLifecycle.html。但是,我仍然不满意你调用AlertPanel的方式 – soorapadman

+0

感谢您的回复,但是请您将所有内容放在一个评论中,因为这样很难提及。另外,请具体说明为什么在我的方式中引用面板不好 – Vishal

+0

@soorapadman这种方式有什么问题?请提出一个更好的建议,并且在返回Component时,'this.getPage()。get(“alertPanel”)'不能使用替换。我可以投它,但我不认为我应该作为组件已经有'replaceWith()'我已经尝试,但不工作。 – Vishal

如果渲染已经开始(它看起来有 - onBeforeRender()),那么你将无法替换任何组件。

您应该将逻辑移至ACTION阶段,例如, onClick(),onSubmit()等。在这种操作方法中广播一个事件:send(getPage(), Broadcast.DEPTH, new SomeCustomEvent())。然后,无论是在AlertPanel的父级,您都应该重写#onEvent(IEvent),并且当事件有效负载为SomeCustomEvent时,请执行替换。

有关的详细信息如下:https://ci.apache.org/projects/wicket/guide/7.x/single.html#_wicket_events_infrastructure

+0

你是正确的一种方式。如果组件是相同的页面,为什么我们需要使用'broadcast'事件? 'target.add(alertPanel)'够了吗?原谅我,如果我错了。 – soorapadman

+0

如果你有组件之间的参考,那么你不需要事件。但是页面通常是由独立的组件/容器构成的,这些组件/容器对彼此一无所知。为避免紧密耦合,我建议通过消息进行通信,即事件。 –

有两种方法: 1)复杂的一个:使用听众 2)或使用方法覆盖,这样:

AlertPanel alertPanel = new AlertPanel(); 
alertPanel.setOutputMarkupId(true); 

ListView list = new MyListView(){ 
    @Override 
    protected onMyEvent(AjaxRequestTarget target){ 
     target.add(alertPanel); 
    } 
} 

page.add(alertPanel,list); 

onMyEvent()方法的MyListView可以是抽象的,必须在MyListView内部更新alertPanel的地方调用(例如,当按下某些行的按钮时)