wicket:如何在AjaxLazyLoadPanel之后更新组件?

时间:2011-05-23 00:06:54

标签: ajax wicket

我有一个页面,其中包含状态文本标签和执行某些数据库查询的面板。因为查询可能需要一些时间我使用

加载它
add(new AjaxLazyLoadPanel("resultPanel")
{
    @Override
public Component getLazyLoadComponent(String id) {
        return new SearchResultPanel(id);
    }
};

效果很好。

我的问题是如何更新resultPanel之外的状态标签,以显示搜索结果的数量?

我在思考addComonent(目标),但我没有目标?我离开了赛道吗?

3 个答案:

答案 0 :(得分:1)

SearchResultPanel可能如下所示:

public class SearchResultPanel extends Panel implements IHeaderContributor{
   public SearchResultPanel(String id){
      super(id);
      ....
   }
   public void renderHead(IHeaderResponse response){
      response.renderOnDomReadyJavascript("alert('hello');");
   }
}

现在当它被加载时它应该抛出那个javascript。之前在stackoverflow上回答的另一种方法(虽然我不喜欢它)是使用AjaxSelfUpdatingTimerBehavior,除非javascript应该运行得更多,然后我不喜欢,并且在我看来它仍然不那么优雅。

在这里查看他们的答案:Wicket: reload AjaxLazyLoadPanel automatically

答案 1 :(得分:0)

如果有一个活动的请求周期,你总是可以使用RequestCycle.get().getRequestTarget()获取当前的请求目标,所以理论上你可以从你的延迟加载的组件构造函数中做到这一点,检查它是否是一个Ajax目标,并添加组件(如果是。)

另一个解决方案是查看AjaxLazyLoadPanel的源代码并基于它创建自己的组件。 (这很简单但是你可以看到,如果你看一下代码,你就无法让它暴露出请求目标。这不是一件非常容易做到的事情,但是因为所有重要的功能都包含在构造函数中,你几乎没有选择..

我会避免不得不篡改Javascript,除非没有别的办法。

答案 2 :(得分:0)

碰巧遇到过这篇文章,我还有一些东西需要补充。

AjaxLazyLoadPanel 现在有一个名为onComponentLoaded(Component, AjaxRequestTarget )的可覆盖方法,它也可以解决您的问题。