f:在datatable中的setpropertyactionlistener没有给我当前行,而是它总是给我最后一个对象.. 请帮助。谢谢!
code.xhtml
<p:dataTable id="datatableid" value="#{updateSiteObj.emsList}" var="pickListObjEMS" >
<p:column headerText="EMS">
<p:pickList id="pojoPickListEMSID" value="#{pickListObjEMS.serverList}" var="ems"
itemValue="#{ems}" itemLabel="#{ems}" style="border-color: white!important" onTransfer="ajaxSubmit1()">
<f:facet name="sourceCaption">Available</f:facet>
<f:facet name="targetCaption">To be removed</f:facet>
</p:pickList>
<p:remoteCommand action="# {updateSiteObj.onEMSTransfer}" name="ajaxSubmit1" >
<f:setPropertyActionListener value="# {pickListObjEMS}" target="#{updateSiteObj.tempObj}"/>
</p:remoteCommand>
</p:column>
</p:dataTable>
bean.java
public class UpdateSite {
/** Creates a new instance of UpdateSite */
private List<List<String>> tempEMSList = new ArrayList<List<String>>();
private List<serverList> emsList = new ArrayList<serverList>();
private serverList tempObj = new serverList();
public String updateSiteDetails() {
List<String> source = new ArrayList<String>();
List<String> target = new ArrayList<String>();
for (String[] str : sg.getEMSDetailsList()) {
source.add(str[0]);
}
DualListModel<String> tempSource = new DualListModel<String>(source, target);
serverList obj = new serverList();
obj.setServerList(tempSource);
//here i am adding two objects
emsList.add(emsobj);
}
public void onEMSTransfer() {
System.out.print("tempOBJ size:" + tempObj.getServerList().getSource().size() + "=>" + tempObj.getServerList().getTarget().size());
}
serverList是一个具有数据类型DualListModel变量的类。在onEMSTransfer中,我看到第二个对象正在显示,即使我操作选项列表中的第一个对象..
答案 0 :(得分:1)
<p:remoteCommand>
在全局范围内的给定name
上生成JavaScript函数。您到目前为止的代码基本上生成以下内容(右键单击页面和查看源代码,亲眼看到它):
<script>function ajaxSubmit1() { /* Set pickListObjEMS of row 1. */ }</script>
<script>function ajaxSubmit1() { /* Set pickListObjEMS of row 2. */ }</script>
<script>function ajaxSubmit1() { /* Set pickListObjEMS of row 3. */ }</script>
<script>function ajaxSubmit1() { /* Set pickListObjEMS of row 4. */ }</script>
<script>function ajaxSubmit1() { /* Set pickListObjEMS of row x. */ }</script>
你看,它生成了多个具有相同名称的JS函数,相互重叠直到最后一个!这就解释了为什么你总是得到最后一项;最后生成的JS函数是所有行调用的函数。
至少有两种方法可以解决此问题:
为每个JS函数指定一个唯一的名称。假设您的#{pickListObjEMS}
具有表示唯一标识符的id
属性,则应执行以下操作:
<p:pickList ... onTransfer="ajaxSubmit1_#{pickListObjEMS.id}()">
...
<p:remoteCommand ... name="ajaxSubmit1_#{pickListObjEMS.id}">
在表格外只有一个<p:remoteCommand>
没有<f:setPropertyActionListener>
,并将项目的唯一ID(或行索引)作为请求参数传递。
<p:dataTable>
...
<p:pickList ... onTransfer="ajaxSubmit1({ id: #{pickListObjEMS.id} })">
...
</p:dataTable>
<p:remoteCommand ... name="ajaxSubmit1" />
您只需要根据此处作为名称为#{pickListObjEMS}
的请求参数传递的ID重建所需的id
。