c:forEach +数据表多行选择会使旧的选定值崩溃

时间:2013-11-28 16:18:45

标签: jsf jsf-2 primefaces

我使用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}"  它只返回最终迭代的值(最终数据表),因为在每次迭代中列表都会崩溃旧的选定对象并放入新选择的对象,我该如何防止这种情况?

2 个答案:

答案 0 :(得分:2)

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

看到非常好的答案

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

答案 1 :(得分:1)

很抱歉很晚,但我发现解决方案比我想象的更容易: 首先创建一个新列表

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

第二步将setter修改为:

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

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