3

f:setpropertyactionlistener 内の datatable は現在の行を提供せず、代わりに常に最後のオブジェクトを提供します.. pls help. ありがとう!

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 では、ピックリストの最初のオブジェクトを操作しても、2 番目のオブジェクトが表示されていることがわかります。

4

1 に答える 1

1

は、グローバル スコープで<p:remoteCommand>指定された で JavaScript 関数を生成します。nameこれまでのコードは、基本的に次のように生成します (ページを右クリックしてソースを表示し、自分の目で確認してください)。

<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 関数は、すべての行によって呼び出されるものです。

この問題を解決するには、少なくとも 2 つの方法があります。

  1. 各 JS 関数に一意の名前を付けます。一意の識別子を表すプロパティ#{pickListObjEMS}があると仮定すると、次のようになります。id

    <p:pickList ... onTransfer="ajaxSubmit1_#{pickListObjEMS.id}()">
    ...
    <p:remoteCommand ... name="ajaxSubmit1_#{pickListObjEMS.id}">
    
  2. <p:remoteCommand>テーブルの外に1つだけ持って<f:setPropertyActionListener>、アイテムの一意のID(または行インデックス)をリクエストパラメーターとして渡します。

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

    #{pickListObjEMS}ここでは name のリクエスト パラメータとして渡された ID に基づいて、目的のものを再構築するだけで済みますid

于 2013-05-23T13:46:27.653 に答える