如何从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
如果渲染已经开始(它看起来有 - 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
你是正确的一种方式。如果组件是相同的页面,为什么我们需要使用'broadcast'事件? 'target.add(alertPanel)'够了吗?原谅我,如果我错了。 – soorapadman
如果你有组件之间的参考,那么你不需要事件。但是页面通常是由独立的组件/容器构成的,这些组件/容器对彼此一无所知。为避免紧密耦合,我建议通过消息进行通信,即事件。 –
有两种方法: 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的地方调用(例如,当按下某些行的按钮时)
使用'replace'组件将为您工作。查看此链接https ://ci.apache.org/projects/wicket/guide/6.x/guide/componentLifecycle.html。但是,我仍然不满意你调用AlertPanel的方式 – soorapadman
感谢您的回复,但是请您将所有内容放在一个评论中,因为这样很难提及。另外,请具体说明为什么在我的方式中引用面板不好 – Vishal
@soorapadman这种方式有什么问题?请提出一个更好的建议,并且在返回Component时,'this.getPage()。get(“alertPanel”)'不能使用替换。我可以投它,但我不认为我应该作为组件已经有'replaceWith()'我已经尝试,但不工作。 – Vishal