0

を使用してページに表示されるリストfアイテムに「カートにアイテムを追加」機能を実装しようとしています<p:dataList>。追加ボタンはp:selectBooleanButtonです。

ボタンにajaxリスナーをアタッチして、バッキングBeanのコレクションに現在のアイテムを追加しました。ただし、listenerメソッドは呼び出されませんが、ボタンのレンダリングは更新されます。

作品を添付しvalueChangeListenerますが、使ってはいけないと思いますか?

ただし、どちらの場合でも、私のページネーションは機能しなくなります。ページネーションボタンのいずれかをクリックしても、ページのコンテンツは変更されません。

誰かが同じことを手伝ったり、より良いアプローチを提案したりできますか?

コードは次のとおりです。

バッキングビーン

@ManagedBean(name = "movies")
@ViewScoped
public class MovieListBean extends BaseBean implements Serializable
{
   private static final long serialVersionUID = -1887386711644123475L;

   private LazyDataModel<Movie> lazyModel;

   private Map<Integer, Rental> cart;

   @PostConstruct
   public void initialize() {
      cart = new HashMap<>(0);
   }

   public LazyDataModel<Movie> getLazyModel() 
   {
      if (lazyModel == null) 
      {
         lazyModel = new LazyDataModel<Movie>() {

            private static final long serialVersionUID = -858683609299266223L;

            @Override
            public List<Movie> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) 
            {
               List<Movie> movieList = serviceLocator.getMovieService().getMovieCatalogInRange(first, (first + pageSize));
               this.setRowCount(serviceLocator.getMovieService().getCatalogSize());
               return movieList;
            }
         };
      }
      return lazyModel;
   }

   public void updateCart(Object obj)
   {
      System.out.println("Selected Movie ID" + obj);
      if (lazyModel != null)
      {
         System.out.println("Selected row in datalist - " + lazyModel.getRowIndex());
         System.out.println("Object instance associated with selected row - " + lazyModel.getRowData());
      }
      // Process object instance and add to cart
   }

   public Map<Integer, Rental> getCart() {
      return cart;
   }

   public void setCart(Map<Integer, Rental> cart) {
      this.cart = cart;
   }

}

index.xhtml

<ui:composition template="/WEB-INF/templates/template.xhtml">
   <ui:define name="content">
      <h:outputStylesheet name="movies.css" library="styles" />

      <h:form prependId="false" id="form">
         <p:dataList value="#{movies.lazyModel}" var="movie" id="movies" paginator="true" rows="10"
            paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
            type="none" paginatorAlwaysVisible="false" lazy="true">

            <p:panel id="movieInfo">
               <h:outputText value="#{movie.movieName}" styleClass="titles" />
               <div id="infoContainer">
                  <div>
                     <h:graphicImage library="images" name="#{movie.imageUri}" />
                  </div>
                  <div>
                     <div>
                        <h:outputText value="#{movie.plotLine}" />
                     </div>
                     <div class="rating">
                        <span>Rating : </span>
                        <p:rating value="#{movie.rating}" stars="10" readonly="true" />
                     </div>
                     <div id="rent">
                        <p:selectBooleanButton offLabel="Add to Cart" onLabel="Remove from Cart" id="btnRent"
                        value="#{not empty movies.cart[movie.movieID]}">
                           <p:ajax update="btnRent" listener="#{movies.updateCart (movie.movieID)}" event="click"/>
                        </p:selectBooleanButton>
                     </div>
                  </div>
               </div>
            </p:panel>

         </p:dataList>
      </h:form>

   </ui:define>
</ui:composition>

JSF 2.1(Mojarra)+Primefaces3.5を使用しています

4

1 に答える 1

1

あなたの価値p:selectBooleanButtonはです#{not empty movies.cart[movie.movieID]}。これは不可能です。これはブール値であり、getterとsetterを持ついくつかのプロパティである必要があります。JSFがAJAXで送信されるときにフィールドを設定するとどう思いますか?このボタンはデータテーブルにあるため、値をブール値の配列として整理できます。

于 2013-02-24T18:02:58.177 に答える