0

ListView を使用してフォーム内の可変数の要素で構成されるシンプルなフォームがあります。各要素は表の行にあり、名前 (正常に機能するリンク付き) と、その行を削除するようにマークする CheckBox が含まれています。フォームで編集できるのはチェックボックスのみです。フォームの下部には、選択したチェックを含むすべてのエントリを削除するために使用される「選択を削除」ボタンがあります。

RepeatingView と ListView でこれを試してみましたが、両方とも同じ問題があります。フォームが送信されたときにチェックボックスの内部モデルの状態が更新されず、常に false です。SearchWrapper クラスの setSelected メソッドでは、ロガー出力は表示されません (他のログは表示されるため、ログの問題ではありません)。

なぜこれが間違っているのか誰にもわかりますか?

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>

前もって感謝します。

4

1 に答える 1

0

問題は、チェックボックスを設定するときに明確なモデル オブジェクトを定義していないことです。このモデルは、onSubmit メソッドでできる方法で初期化する必要があります。

モデルオブジェクトを SavedSearchesTab コンストラクターでインスタンス化し、変数が最終であることを確認し、フォームに追加して、すべてのレイヤーで使用することを確認することをお勧めします。

変数を回復しようとする方法については、そのようには機能しません。Wicket が機能する方法ではありません。私が提案している場所からモデル オブジェクトをインスタンス化すると、onSubmit メソッドでその変数にアクセスできます。フォームのプロパティを保持します。フォームの値を POJO にマップする必要はありません。Wicket はモデルを使用してこれを行います。

于 2013-07-19T15:02:42.783 に答える