【问题标题】:How to implement multiple selection in primefaces datalist?如何在primefaces datalist中实现多项选择?
【发布时间】:2013-02-26 19:46:21
【问题描述】:

我正在尝试使用 <p:selectBooleanButton> 跟踪来自 <p:datalist> 的选定项目。我正在使用下面的 sn-p 来呈现列表。

<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" rowIndexVar="currentRow" >

   <p:panel id="movieInfo">

     <!-- content markup -->

      <div id="rent">
         <p:selectBooleanButton offLabel="Add to Cart" onLabel="Remove from Cart" id="btnRent"
            value="#{movies.checkedItems[currentRow]}">
            <p:ajax update="btnRent" listener="#{movies.updateCart()}" event="click" process="btnRent"/>
         </p:selectBooleanButton>
      </div>

   </p:panel>

</p:dataList>

BackingBean

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

   ....

   private boolean[] checkedItems;

   @PostConstruct
   public void initialize() 
   {
      int totalRows = serviceLocator.getMovieService().getCatalogSize();
      checkedItems = new boolean[totalRows];
   }

   ....

   public void updateCart()
   {
      if (lazyModel != null)
      {
         int selectedIndex = lazyModel.getRowIndex();
         System.out.println("Selected row in datalist - " + selectedIndex);
         System.out.println("Object instance associated with selected row - " + lazyModel.getRowData());
         System.out.println("checkedItems[" + selectedIndex + "] - " + checkedItems[selectedIndex]);
      }
   }

   public boolean[] getCheckedItems() {
      return checkedItems;
   }

   public void setCheckedItems(boolean[] checkedItems) {
      this.checkedItems = checkedItems;
   }

}

我已经看到关于 SO 的解决方案以及使用&lt;f:setPropertyActionListener&gt; 演示相同的文档,但它要求您使用ActionSource,即commandButton 或commandLink。还有,大部分都是&lt;p:dataTable&gt;

在我的示例中不是这种情况,因为我必须从集合中添加/删除对象以及更新标题文本中的计数。这将在侦听器中实现,但似乎没有被触发。

所以,我的问题是如何在仍然使用 dataList 的同时改变我的方法。使用上面的 sn-ps 也会破坏分页。

我正在使用 JSF 2.1 (Mojarra) + PrimeFaces 3.5

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    要在 &lt;p:dataList/&gt; 中启用操作组件,您需要将组件组包装在 &lt;p:column/&gt;

         <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" rowIndexVar="currentRow" >
             <p:column>
                  <p:panel id="movieInfo">
                     <div id="rent">
                        <p:selectBooleanButton offLabel="Add to Cart" onLabel="Remove from Cart" id="btnRent" value="#{movies.checkedItems[currentRow]}">
                      <p:ajax update="btnRent" listener="#{movies.updateCart()}" event="click" process="btnRent"/>
                        </p:selectBooleanButton>
                     </div>
                 </p:panel>
             </p:column>
         </p:dataList>
    

    【讨论】:

    • 我也试过了。但正如您所见,我不能使用 commandButton 或 commandLink,因为我必须即时添加/删除项目并明智地显示相同的 UI。因此,我想到了使用类似于 selectBooleanCheckbox 的 selectBooleanButton。无论如何我可以使用这些组件来实现吗?或者如果可能的话,如果使用动作组件是唯一的方法(考虑分页),则保持 UI 状态?
    猜你喜欢
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2015-04-23
    • 2022-06-14
    相关资源
    最近更新 更多