如何使用Wicket的Ajax Link创建可更新面板?

时间:2010-03-23 10:49:45

标签: java ajax wicket

我尝试使用Wicket的AjaxLink来实现更新网站中的表的链接(实际上是许多链接)。但我失败了,表永远不会更新(我有“setOutputMarkupId(true)”并调用“setDefaultModelObject”和“addComponent”,但必须有其他错误)。

如何实现具有多个链接的面板和显示动态数据的表格,具体取决于所点击的链接?有人可以给出一个例子(可能是两个链接,当点击第一个时,表格会显示1-10中的两个随机数,当点击第二个时,表格会显示1-100中的随机数字)?没有重新加载整个页面,只有表格的html?

4 个答案:

答案 0 :(得分:3)

一个可能的原因可能是您没有使用'可刷新'模型,而是获取列表项并将它们直接传递给组件,因此列表在会话中被序列化并且不会更新。

如果是这种情况,请将LoadableDetachableModel(检索其加载方法中的列表)传递给组件。如果没有看到您的代码,我就无法更具体。

答案 1 :(得分:2)

我不认为你已经非常明确地定义了你的行为。

这两个表是不同的实现?如果是这样,那么您的代码是正确的 - 您必须用新的组件替换旧组件,然后将新组件添加到ajax响应中。

但实际上,我想你有1个表组件实现。

你需要做的是这样的事情:

public class RandomNumberListModel extends LoadableDetachableModel {
    private int upperBound;

    public RandomNumberListModel(int upperBound) {...}

    public void setUpperBound(int upperBound) {...}

    protected Object load() {
        // generate random number list using upper bound
        // return list
    }        
}

...

final MyTableComponent table = new MyTableComponent(new RandomNumberListModel(30));
add(table);    
AjaxLink link = new AjaxLink("myButton") {
    public void onClick(final AjaxRequestTarget target) {
        table.getModel().setUpperBound(100);
        target.addComponent(table);
    }
};
add(link);

(编辑)我添加了一个动态的,可重复使用的模型来说明模型的工作原理。根据您希望重用的内容,有不同的实现方法。关键是模型动态生成列表,即每个请求,并且可以在onClick回调中操作数字范围的upperBound。

答案 2 :(得分:1)

就像jboyd问你有没有知道在Ajax响应中发送表内容的代码吗?:

final Component tableComponent = ....;
AjaxLink link = new AjaxLink("myButton"){
    public void onClick(final AjaxRequestTarget target) {
        target.addComponent(tableComponent);
    }
};
add(link);

addComponent部分是jboyd所指的部分。

答案 3 :(得分:1)

wicketstuff.org示例中有一个这样的例子,tree/tree table。顶部的三个链接改变了表格。