Модель не обновляется при вызове ссылки AJAX - PullRequest
1 голос
/ 12 ноября 2011

Я пытаюсь реализовать просмотр списка AJAXfied Wicket.В ходе моего исследования я наткнулся на код на этом сайте и немного его изменил.

Модель не обновлена ​​должным образом.Таким образом, всякий раз, когда значение вводится в текстовое поле, забывается, если вызывается ссылка для отправки AJAX (текстовое поле пусто).Почему это происходит?Я не вижу никаких проблем с этим кодом.Версия калитки 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 ]

3 голосов
/ 14 ноября 2011

Мой предыдущий комментарий как anwser:

Возможно, вам потребуется вызвать setReuseItems (true) для просмотра списка.

Другой способ настройки просмотра списка можно найти на блоге Wicket in Action

1 голос
/ 19 ноября 2011

Вы должны использовать модель из цели следующим образом:

IModel model = target.getModel();

Затем приведите к listView.Я не знаю, работает ли это, но у меня есть некоторый подобный код здесь.

1 голос
/ 17 ноября 2011

Ваш пример будет работать нормально, если вы не добавили следующую строку:

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. Но все равно будет работать так, как если бы формы были вложенными.

...