如何从Apache Wicket中的另一个ListView刷新Panel?

时间:2017-08-17 08:18:48

标签: wicket

我有一个面板(比如AlertPanel),当listView呈现时需要刷新某些条件。

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

我试图像这样覆盖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

2 个答案:

答案 0 :(得分:1)

如果渲染已经开始(并且它似乎有 - 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

答案 1 :(得分: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);
MyListView的 onMyEvent()方法可以是抽象的,必须在MyListView内部更新alertPanel的地方调用(例如,当某些行按下按钮时)