Wicket - форма с ListItem и флажками, не устанавливающими состояние флажка
У меня есть простая форма, которая состоит из переменного количества элементов в форме, используя ListView. Каждый элемент находится в строке таблицы и содержит имя (со ссылкой, которая работает нормально) и CheckBox, который отмечает эту строку для удаления. Только флажки доступны для редактирования в форме. Внизу формы находится кнопка "Удалить выбранное", которая будет использоваться для удаления всех записей с выбранной проверкой.
Я попытался сделать это с RepeatingView и ListView, и у обоих есть та же самая проблема - внутреннее состояние модели флажков не обновляется, когда форма отправлена - они всегда ложны. В методе setSelected класса SearchWrapper выходные данные средства ведения журнала никогда не отображаются (другие способы ведения журнала, так что это не проблема ведения журнала)
Кто-нибудь может понять, почему это не так?
public class SavedSearchesTab extends Panel
{
private static final Logger LOGGER = ...
/**
*
*/
public SavedSearchesTab( String p_id )
{
super( p_id );
Form<?> l_form = new Form<Object>( "savedsearchform" ) {
/**
* @see org.apache.wicket.markup.html.form.Form#onSubmit()
*/
protected void onSubmit()
{
LOGGER.info( "Form Submitted!" );
for( String l_paramName : getRequest().getRequestParameters().getParameterNames() ) {
LOGGER.info( "FormParam: " + l_paramName + ", value=" + getRequest().getRequestParameters().getParameterValue( l_paramName ) );
}
onDeleteSelected();
}
};
l_form.setOutputMarkupId( true );
add( l_form );
List<UserSavedSearch> l_searches = getSearches();
ListView<UserSavedSearch> l_repeater = new ListView<UserSavedSearch>( "repeater", l_searches ) {
protected void populateItem( final ListItem<UserSavedSearch> p_item )
{
final UserSavedSearch l_search = p_item.getModelObject();
SearchWrapper l_wrapper = new SearchWrapper( l_search );
AjaxLink<UserSavedSearch> l_link = new AjaxLink<UserSavedSearch>( "searchnamelink" ) {
private static final long serialVersionUID = 1L;
public void onClick( AjaxRequestTarget p_target )
{
selectSearch( l_search );
}
};
String l_linkText = l_search.getName();
Label l_linkLabel = new Label( "searchnamelabel", l_linkText );
l_link.add( l_linkLabel );
p_item.add( l_link );
TextArea<String> l_descriptionArea = new TextArea<String>( "searchsummary", new Model<String>( toSummary( l_search ) ) );
p_item.add( l_descriptionArea );
CheckBox l_checkbox = new CheckBox("searchcheckbox", new PropertyModel<Boolean>( l_wrapper, "selected" ) );
p_item.add( l_checkbox );
}
};
l_repeater.setReuseItems( true );
l_form.add(l_repeater);
}
private List<UserSavedSearch> getSearches() {
List<UserSavedSearch> l_searches = new ArrayList<UserSavedSearch>();
// Make a couple of example ones for testing
UserSavedSearch l_eg = new UserSavedSearch();
l_eg.setName( "Example Search 1" );
l_eg.setSearchArea( SearchArea.CUSTOMERS );
l_searches.add( l_eg );
l_eg = new UserSavedSearch();
l_eg.setName( "Example Search 2" );
l_eg.setSearchArea( SearchArea.CUSTOMERS );
l_searches.add( l_eg );
return l_searches;
}
private String toSummary( UserSavedSearch p_search ) {
return "Summary of " + p_search.getName(); // TODO
}
protected void onDeleteSelected() {
}
protected void selectSearch( UserSavedSearch p_search ) {
LOGGER.info( "Search " + p_search.getName() + " should be displayed!" );
}
private class SearchWrapper implements Serializable {
private static final long serialVersionUID = 1L;
private UserSavedSearch m_data;
private Boolean m_toDelete;
public SearchWrapper( UserSavedSearch p_data ) {
m_data = p_data;
m_toDelete = false;
}
public boolean isSelected() {
return m_toDelete;
}
public void setSelected( boolean p_selected ) {
LOGGER.info( "SETTING SEARCHWRAPPER SELECTED STATE: " + p_selected );
m_toDelete = p_selected;
}
public UserSavedSearch getSearch() {
return m_data;
}
}
HTML:
<wicket:panel>
<span class="sectiontitle"><wicket:message key="sectiontitle">savedsearches</wicket:message></span>
<form wicket:id="savedsearchform">
<fieldset>
<table id="savedsearchtable">
<tbody wicket:id="repeater">
<tr>
<td><input wicket:id="searchcheckbox" type="checkbox" name="searchselect" wicket:message="value:fragment.select.search" /></td>
<td><a href="#" wicket:id="searchnamelink"><span wicket:id="searchnamelabel">searchname</span></a></td>
</tr>
<tr>
<td colspan="2"><textarea wicket:id="searchsummary" readonly="readonly" rows="3" cols="100"/></td>
</tr>
</tbody>
<tr class="buttonPanel">
<td colspan="2">
<input type="submit" wicket:message="value:button.deleteselectedsearches"/>
</td>
</tr>
</table>
</fieldset>
</form>
</wicket:panel>
Заранее спасибо.
1 ответ
Проблема заключается в том, что вы не определяете чистый объект модели при установке флажков. Эта модель должна быть инициализирована так, как вы можете в методе onSubmit.
Я бы предложил создать экземпляр объекта вашей модели в конструкторе SavedSearchesTab, убедиться, что переменная является окончательной, добавить ее в форму и убедиться, что вы используете ее во всех слоях.
Что касается того, как вы пытаетесь восстановить переменные, это не сработает таким образом, это не то, как должен работать Wicket, если вы создаете экземпляр объекта модели, откуда я вам предлагаю, вы можете получить доступ к этой переменной в методе onSubmit и будет иметь свойства из формы, вам не нужно заботиться о том, чтобы сопоставить значения формы с вашими POJO, Wicket сделает это за вас с помощью Модели.