【问题标题】:f:setpropertyactionlistener in datatable always return me the last object数据表中的 f:setpropertyactionlistener 总是返回最后一个对象
【发布时间】:2013-05-23 13:18:07
【问题描述】:

f:setpropertyactionlistener 里面的数据表并没有给我当前行而是它总是给我最后一个对象.. 请帮忙。谢谢!

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

【问题讨论】:

    标签: java jsf jsf-2 primefaces


    【解决方案1】:

    &lt;p:remoteCommand&gt; 在全局范围内对给定的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. 表外只有一个&lt;p:remoteCommand&gt;,没有&lt;f:setPropertyActionListener&gt;,并将项目的唯一ID(或者可能是行索引)作为请求参数传递。

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

      您只需要根据此处作为请求参数传递的名为id 的ID 重构所需的#{pickListObjEMS}

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 2019-03-19
      • 2012-07-21
      相关资源
      最近更新 更多