2013-07-19 2 views
0

У меня есть простая форма, состоящая из переменного количества элементов в форме с помощью ListView. Каждый элемент находится в строке таблицы и содержит имя (со ссылкой, которое отлично работает) и CheckBox, который отмечает эту строку для удаления. Только флажки могут быть изменены в форме. В нижней части формы находится кнопка «Удалить выбранную», которая будет использоваться для удаления всех записей с выбранной проверкой.Wicket - Form with ListItem и флажки не установлены Состояние флажка

Я попытался сделать это с помощью 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> 

Спасибо заранее.

+0

Вы пытались использовать 'List ' как модель 'ListView'? –

ответ

0

Проблема в том, что вы не определяете четкий объект модели при заполнении флажков. Эта модель должна быть инициализирована таким образом, чтобы вы могли ее использовать в методе onSubmit.

Я предлагаю создать экземпляр объекта модели в конструкторе SavedSearchesTab, убедитесь, что переменная является окончательной, добавьте ее в форму и убедитесь, что вы используете ее во всех своих слоях.

О том, как вы пытаетесь восстановить переменные, это не сработает, не так, как должен работать Wicket, если вы создаете экземпляр объекта модели, откуда я предлагаю вам, вы можете получить доступ к этой переменной на onSubmit, и он будет иметь свойства из формы, вам не нужно будет отображать значения форм в ваши POJO, Wicket делает это для вас с помощью модели.

Смежные вопросы