AJAX提交链接调用未更新模型

时间:2011-11-12 10:36:33

标签: ajax wicket

我正在尝试实现一个AJAXfied Wicket列表视图。在我的研究中,我偶然发现this site上的代码并对其进行了一些修改。

模型未正确更新。因此,只要在文本字段中输入值,就会忘记调用AJAX提交链接(文本字段为空)。为什么会这样?我没有看到此代码有任何问题。 Wicket版本是1.5.2。

这是Java代码:

// Initialization of form
...

// List all rows
ArrayList<String> rows = new ArrayList<String>(2);
rows.add(new String());
rows.add(new String());

final ListView<String> lv = new ListView<String>("rows", rows) {
    @Override
    protected void populateItem(ListItem<String> item) {
        int index = item.getIndex() + 1;
        item.add(new Label("index", index + "."));

        TextField<String> text = new TextField<String>("text", item.getModel());
        item.add(text);
    }
};
rowPanel.add(lv);

    AjaxSubmitLink addLink = new AjaxSubmitLink("addRow", form) {

    @Override
    protected void onError(AjaxRequestTarget target, Form<?> form) {
        if (target != null) target.add(rowPanel);       
    }

    @Override
    protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
        lv.getModelObject().add(new String());
        if (target != null) target.add(rowPanel);
    }
};
addLink.setDefaultFormProcessing(false);
rowPanel.add(addLink);
...

这是标记:

<div wicket:id="rowPanel">
    <span wicket:id="rows">
        <span wicket:id="index">1.</span>
        <input type="text" wicket:id="text"/>
    </span>
    <a href="#" wicket:id="addRow">Add row</a>
</div>

3 个答案:

答案 0 :(得分:3)

我以前作为anwser的评论:

您可能需要在listview上调用setReuseItems(true)。

另一种激活列表视图的方法可以在the Wicket in Action blog

找到

答案 1 :(得分:1)

如果您没有添加以下行,您的示例将正常工作:

addLink.setDefaultFormProcessing(false);

您的链接不会像通常那样处理表单(更新模型等,请参阅IFormSubmitter

您可以使用嵌套表单仅更新所需区域,并将defaultFormProcessing设置为true。

像:

    <form wicket:id="form">
(...) <!-- (other form elements you dont want to get updated -->
    <form wicket:id="repeaterForm"> <!-- form for your repeater textfields-->
        <div wicket:id="refreshDiv">
            <input type="textfield" wicket:id="repeaterText" />
        </div>
        <a wicket:id="addMoreLink>add more</a>
    </form>
</form>

Wicket将确保您的标记中实际上没有嵌套表单(它将用div替换嵌套表单),因为它不是有效的HTML。但它可以像表格嵌套一样工作。

答案 2 :(得分:1)

您必须使用目标中的模型:

IModel model = target.getModel();

然后转换为listView。我不知道这是否有效,但我在这里有一些类似的代码。