一、背景阐述
页面利用dataTable显示多行记录,一行记录记录着一个用户的信息,其中用户状态的那个column用<h:selectOneMenu>显示,以便可以任意更改其状态。此外,由于同一用户可能在不同部门,所以,页面上可能会有多行记录,显示的是同一用户的信息,只是部门的值不同。
所以,现在就需要实现这样一个功能:当一个用户的状态改变了,页面上所有属于这个用户的记录的status column的值都要改变成新改好的状态。
二、解决思路
在每行记录的h:selectOneMenu后面标记一个h:inputHidden来存储userId的值,利用οnchange="changeUserStatus(this);"得到改变了状态的user的userId和user的新状态,然后遍寻整个页面的每行记录的h:inputHidden中的userId,如果和改变的userId一样,就说明是同一个user,则改变该条记录的user状态,否则不变。
三、实现方法
1.页面代码:
2.JS代码:
四、附录-该问题的特点
值得注意的是,在页面上,jsf会自动给dataTable的每行的元素赋一个id,即如果<h:selectOneMenu id="status"/>,则h:selectOneMenu显示在页面上的id=“form名:dataTable名:该记录在list中所在的条数:status”。而且,由于dataTable要显示近千条record在一张页面上是不好看的,所以利用t:dataScroller让每页只显示45条,这样我们每次就要知道当前页的第一条记录的id和做后一条记录的id,从而确定查询的范围。
页面利用dataTable显示多行记录,一行记录记录着一个用户的信息,其中用户状态的那个column用<h:selectOneMenu>显示,以便可以任意更改其状态。此外,由于同一用户可能在不同部门,所以,页面上可能会有多行记录,显示的是同一用户的信息,只是部门的值不同。
所以,现在就需要实现这样一个功能:当一个用户的状态改变了,页面上所有属于这个用户的记录的status column的值都要改变成新改好的状态。
二、解决思路
在每行记录的h:selectOneMenu后面标记一个h:inputHidden来存储userId的值,利用οnchange="changeUserStatus(this);"得到改变了状态的user的userId和user的新状态,然后遍寻整个页面的每行记录的h:inputHidden中的userId,如果和改变的userId一样,就说明是同一个user,则改变该条记录的user状态,否则不变。
三、实现方法
1.页面代码:
- <h:form id=“form”>
- <t:dataTable id="custRecordList" var="user" value="#{backbeanName.custRecordList}"
- styleClass=" " footerClass=" " headerClass=" " columnClasses="" rowClasses=""
- align="center" cellpadding="4" cellspacing="0" border="0" rows="45">
- <t:column>
- <f:facet name="header">
- <h:outputText value="User Status" />
- </f:facet>
- <h:selectOneMenu id="status" value="#{user.userStatus}"onchange="changeUserStatus(this);">
- <f:selectItems value="#{backbeanName.userStatusSelectItems}"/>
- </h:selectOneMenu>
- <h:inputHidden id="userIdHidden" value="#{user.userId}" />
- </t:column>
- </t:dataTable>
- <t:dataScroller id="scroller" for="custRecordList" style="position:relative;left:40px"
- fastStep="10" pageCountVar="pageCount" pageIndexVar="pageIndex" paginator="true"
- paginatorMaxPages="10" paginatorActiveColumnStyle="font-weight:bold;text-decoration:none;" renderFacetsIfSinglePage="false">
- <f:facet name="first">
- <t:graphicImage id="firstImg" url="/shared/images/pagination/first.gif" border="1" />
- </f:facet>
- <f:facet name="last">
- <t:graphicImage id="lastImg" url="/shared/images/pagination/last.gif" border="1" />
- </f:facet>
- <f:facet name="previous">
- <t:graphicImage id="prevImg" url="/shared/images/pagination/previous.gif" border="1" />
- </f:facet>
- <f:facet name="next">
- <t:graphicImage id="nextImg" url="/shared/images/pagination/next.gif" border="1" />
- </f:facet>
- <f:facet name="fastforward">
- <t:graphicImage id="ffImg" url="/shared/images/pagination/fforward.gif" border="1" />
- </f:facet>
- <f:facet name="fastrewind">
- <t:graphicImage id="frImg" url="/shared/images/pagination/fbackward.gif" border="1" />
- </f:facet>
- </t:dataScroller>
- </h:form>
- <script type="text/javascript">
- //<![CDATA[
- function changeCustStatus(obj){
- var userId = obj.nextSibling.value; //得到h:selectOneMenu的下一个标签(h:inputHidden)的value
- var userStaus = obj.value; //得到h:selectOneMenu的value
- var firstSelectComponentId=document.getElementsByTagName("select")[0].id; //得到每页第一行记录的h:selectOneMenu的id
- var rowNum=firstSelectCompId.split(":"); //rowNum[2]为每页第一行记录在整个custRecordList里的第几行
- var n=parseInt(rowNum[2])+parseInt(45); //得到每页做后一行记录在整个custRecordList里的第几行
- var unchangeUserId;
- for(var i=rowNum[2];i<n;i++){
- unchangeUserId=document.getElementById("form:custRecordList:"+i+":userIdHidden").value;
- if(unchangeUserId==userId){
- document.getElementById("form:custRecordList:"+i+":status").value=userStaus;
- }
- }
- }
- //]]>
- </script>
四、附录-该问题的特点
值得注意的是,在页面上,jsf会自动给dataTable的每行的元素赋一个id,即如果<h:selectOneMenu id="status"/>,则h:selectOneMenu显示在页面上的id=“form名:dataTable名:该记录在list中所在的条数:status”。而且,由于dataTable要显示近千条record在一张页面上是不好看的,所以利用t:dataScroller让每页只显示45条,这样我们每次就要知道当前页的第一条记录的id和做后一条记录的id,从而确定查询的范围。