我有一个页面,其中包含状态文本标签和执行某些数据库查询的面板。因为查询可能需要一些时间我使用
加载它add(new AjaxLazyLoadPanel("resultPanel")
{
@Override
public Component getLazyLoadComponent(String id) {
return new SearchResultPanel(id);
}
};
效果很好。
我的问题是如何更新resultPanel之外的状态标签,以显示搜索结果的数量?
我在思考addComonent(目标),但我没有目标?我离开了赛道吗?
答案 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应该运行得更多,然后我不喜欢,并且在我看来它仍然不那么优雅。
答案 1 :(得分:0)
如果有一个活动的请求周期,你总是可以使用RequestCycle.get().getRequestTarget()
获取当前的请求目标,所以理论上你可以从你的延迟加载的组件构造函数中做到这一点,检查它是否是一个Ajax目标,并添加组件(如果是。)
另一个解决方案是查看AjaxLazyLoadPanel
的源代码并基于它创建自己的组件。 (这很简单但是你可以看到,如果你看一下代码,你就无法让它暴露出请求目标。这不是一件非常容易做到的事情,但是因为所有重要的功能都包含在构造函数中,你几乎没有选择..
我会避免不得不篡改Javascript,除非没有别的办法。
答案 2 :(得分:0)
碰巧遇到过这篇文章,我还有一些东西需要补充。
AjaxLazyLoadPanel 现在有一个名为onComponentLoaded(Component, AjaxRequestTarget )的可覆盖方法,它也可以解决您的问题。