【问题标题】:c:forEach + Data table multiple row selection crashes old selected valuesc:forEach + 数据表多行选择崩溃旧选择值
【发布时间】:2013-11-28 16:18:45
【问题描述】:

我使用 JSF 2.0 和 primefaces 4.0

我的 JSF 代码:

 <c:forEach items="#{materielbean.materielist}" var="list" >
        <p:dataTable  var="car" value="#{materielbean.listeitemsmaterielbyidmateriel(list.idmateriel)}" rowKey="#{car.iditemsmateriel}"  
                 selection="#{fournisseurbean.selectedItemsMateriel}" selectionMode="multiple" style="width : 664px; ">  
        <f:facet name="header">  
          #{list.nommateriel} 
        </f:facet>          


        <p:column headerText="designation">  
            #{car.designation}  
        </p:column>  
        <p:column headerText="Unité">  
            #{car.unite}  
        </p:column>   


    </p:dataTable> 

     </c:forEach> 

以及使用的功能

listeitemsmaterielbyidmateriel(list.idmateriel)

是这样定义的

public List listeitemsmaterielbyidmateriel(int i){
return  itemmaterielDAO.DisplayItemsMaterielDAOselonmMateriel(i);
}

最后这是 DAO 代码

public  List DisplayItemsMaterielDAOselonmMateriel(int idmateriel )
    {

        Query q = em.createQuery("select LIM from ItemsMateriel LIM inner join LIM.materiel where LIM.materiel.idmateriel= :idmateriel");
        q.setParameter("idmateriel", idmateriel);
        List l = new ArrayList();
        l= q.getResultList();

        return l ;
    }

当我运行这段代码时,我没有出错,但是selection="#fournisseurbean.selectedItemsMateriel}" 只返回最终迭代(最终数据表)的值,这是因为在每次迭代中,列表都会崩溃旧的选定对象并放置新的选定对象,我该怎么做才能防止这种情况发生??

【问题讨论】:

  • 这是一个已知问题,但最近已在 MyFaces 2.2.x 中修复。详情请参阅:MYFACES-3811。你可以试试latest snapshot 看看它是否适合你。

标签: jsf jsf-2 primefaces


【解决方案1】:

将 JSTL 核心标签与 JSF- 和/或 *Faces 标签混用是很危险的。基本上 JSTL 标记处理程序在视图构建期间执行,而 JSF UIComponents 在视图渲染期间执行。在"JSTL in JSF2 Facelets… makes sense?"查看非常好的答案

您是否已经尝试使用 Facelets ui:repeat 组件解决问题?

【讨论】:

    【解决方案2】:

    抱歉迟到了,但我发现解决方案比我想象的要容易: 首先新建一个列表

    List<ItemsMateriel> Tampon = new ArrayList<ItemsMateriel>();
    

    第二次修改setter为:

    public void setSelectedItemsMateriel(List<ItemsMateriel> selectedItemsMateriel) {               
            Tampon.addAll(selectedItemsMateriel);
            this.selectedItemsMateriel = selectedItemsMateriel;         
        }
    

    最后使用新列表(Tampon),您将找到所有选定的对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多