wicket - внедрить Ajax добавить / удалить элементы ListView - PullRequest
1 голос
/ 18 августа 2010

Я схожу с ума по этой проблеме.Я реализовал ListView, который вы можете добавлять / удалять TextField динамически, но удаляется только последний TextField.

Пример:

// Object type which is used in the list
public class ExampleObject implements Serializable{
    private String keyword;

    public String getKeyword() {
        return this.keyword;
    }

    public void setKeyword(String s) {
        keyword = s;
    }
}

//ListView
List<ExampleObject> keywordList = new ArrayList<ExampleObject>();
keywordList.add(new ExampleObject());

ListView keywordView = new ListView("keywordView", keywordList) {
    @Override
    protected void populateItem(final ListItem item) {
            ExampleObject model = (ExampleObject) item.getModelObject();
            item.add(new TextField("subKeyword", new PropertyModel(model, "keyword")));

            // keyword remove link
            AjaxSubmitLink removeKeyword = new AjaxSubmitLink("removeKeyword", myForm)         
            {
                @Override
                protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                    ExampleObject selected = (ExampleObject) item.getModelObject();
                    // I also tried deleting by index. println shows the
                    // selected object is the element I want to remove, so why always
                    // remove last object of the list?
                    keywordList.remove(selected);
                    if (target != null) {
                        target.addComponent(myForm);
                    }
                }
            };

            item.add(removeKeyword);

            // keyword add link
            AjaxSubmitLink addKeyword = new AjaxSubmitLink("addKeyword", metadataForm)      
                {
                @Override
                protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                    keywordList.add(new ExampleObject());
                    if (target != null) {
                        target.addComponent(myForm);
                    }
                }
            };
            item.add(addKeyword);
}
keywordView.setReuseItems(true);
metadataForm.add(keywordView);

Любая помощь будет очень признательна, потому что я считаю, что эта проблема действительно очень глупая ошибка, но я не могу ее получить!

Спасибо

Ответы [ 3 ]

5 голосов
/ 19 августа 2010

Это может быть так же просто, как избавиться от строки

keywordView.setReuseItems(true);

Флаг reuseItems эффективен, так что страница не перестраивает элементы ListView без необходимости, но это может привести к путаницекак то, что вы видите.

ListView на самом деле не было предназначено для использования с формами, и вам, вероятно, будет лучше с другой тактикой целиком.

Это запись в блоге о создании компонента формы редактора списков может быть полезной.Потребуются некоторые изменения, если вы не используете Wicket 1.4, но подобные вещи определенно возможны в Wicket 1.3, и в комментариях есть некоторые подсказки.

1 голос
/ 24 января 2012

Прочитайте Javadoc ListView # setReuseItems ():

"Но если вы измените объект модели listView, то вы должны вручную вызвать listView.removeAll () для перестройки ListItems."

1 голос
/ 19 августа 2010

Вы не можете использовать ListView таким образом.Либо используйте предоставленные члены ListView:

removeLink(java.lang.String id, ListItem<T> item)

и

newItem(int index)

, но я никогда не использовал их.Если мне нужно отобразить List и иметь возможность динамически добавлять элементы удаления, я предпочитаю RefreshingView.

Если вы используете FormComponents внутри RefreshingView, убедитесь, что вы установили Reusestartegy (setItemReuseStrategy())

Берт

...