gpt4 book ai didi

java - f :setpropertyactionlistener in datatable always return me the last object

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:05 24 4
gpt4 key购买 nike

f:setpropertyactionlistener inside datatable 不给我当前行而是总是给我最后一个对象..请帮助。谢谢!

代码.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 中,即使我在选择列表中操作第一个对象时,我也看到第二个对象正在显示..

最佳答案

<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 函数是所有行调用的函数。

至少有两种方法可以解决这个问题:

  1. 给每个 JS 函数一个唯一的名字。假设您的 #{pickListObjEMS}有一个 id表示唯一标识符的属性,应该这样做:

    <p:pickList ... onTransfer="ajaxSubmit1_#{pickListObjEMS.id}()">
    ...
    <p:remoteCommand ... name="ajaxSubmit1_#{pickListObjEMS.id}">
  2. 只有一个<p:remoteCommand>没有<f:setPropertyActionListener>在表外并将项目的唯一 ID(或可能是行索引)作为请求参数传递。

    <p:dataTable>
    ...
    <p:pickList ... onTransfer="ajaxSubmit1({ id: #{pickListObjEMS.id} })">
    ...
    </p:dataTable>
    <p:remoteCommand ... name="ajaxSubmit1" />

    你只需要重构想要的#{pickListObjEMS}基于此处作为请求参数传递的 ID,名称为 id .

关于java - f :setpropertyactionlistener in datatable always return me the last object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16714995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com