を使用してページに表示されるリスト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を使用しています