3

簡単な問題があります。PrimefacesDatatableを持っています。ユーザーが行をクリックすると、バッキングBeanで選択されたrowsプロパティが更新されます。これは、Datatableが含まれているフォームを送信することで実現できますが、非同期で実行したいと思います。私はこの質問についてここでさまざまな質問を読みましたが、それでも解決策を見つけることができませんでした。

これは、問題を示すための小さな例です。

JSFページのテスト:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>Facelet Title</title>
</h:head>
<h:body>
    <p:dataTable var="v" value="#{test.values}" selectionMode="multiple"
                 selection="#{test.selectedValue}" rowKey="#{v.value}" >
        <p:column headerText="Test">
            <h:outputText value="#{v.value}" />
        </p:column>
    </p:dataTable>
</h:body>

バッキングビーン:

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.stack.Stack;

@ManagedBean
@ViewScoped
public class Test 
{

    private Value[] selectedValues;

    public List<Value> getValues()
    {
        List<Value> retVal = new ArrayList<Value>();
        retVal.add(new Value("a"));
        retVal.add(new Value("b"));
        return retVal;
    }

    public Value[] getSelectedValues() {
        return selectedValues;
    }

    public void setSelectedValues(Value[] selectedValues) {
        this.selectedValues = selectedValues;
    }
}

そして、彼らが使用する単純なPOJO:

public class Value {

    private String value;
    public Value(String value)
    {
        this.value = value;
    }

    public String getValue()
    {
        return value;
    }

    public void setValue(String value)
    {
        this.value = value;
    }
}

応答に従って、私は次のようにDatatableを更新しました:

    <p:dataTable id="dt" var="v" value="#{test.values}" selectionMode="multiple"
                 selection="#{test.selectedValues}" rowKey="#{v.value}" >
        <p:column headerText="Test">
            <h:outputText value="#{v.value}" />
        </p:column>
        <p:ajax event="rowSelect"/>
        <p:ajax event="rowUnselect" />
    </p:dataTable>

ただし、これでもセッターsetSelectedValues()の呼び出しは失敗します。私は彼らにも言わせました:

    <p:ajax event="rowSelect" update="@this" />
    <p:ajax event="rowUnselect" update="@this" />

そして、これは行がクリックされたときにのみゲッターを呼び出しました。何か案は?

4

4 に答える 4

4

rowSelectでイベントを使用できます<p:ajax>

<p:dataTable ...>
    ...
    <p:ajax event="rowSelect" />
</p:dataTable>

ただし、これはこのコンテキストではほとんど意味がありません。それに属性をフックしたい場合は、もっと理にかなっているでしょうlistenerupdate例えば

<p:dataTable ...>
    ...
    <p:ajax event="rowSelect" update="menu" />
</p:dataTable>

行の選択解除もフックしたい場合は、フックする別の行を追加しrowUnselectます。

<p:dataTable ...>
    ...
    <p:ajax event="rowSelect" />
    <p:ajax event="rowUnselect" />
</p:dataTable>

参照:

于 2012-11-19T15:36:42.317 に答える
3

<p:ajax event="rowSelect" />データテーブル内に追加するだけです

<p:dataTable selection="#{customerView.selectedEntity}" selectionMode="single">
    <p:ajax event="rowSelect" />
<!--more code-->
</p:dataTable>

これにより、バッキングBeanでsetSelectedEntity()が呼び出されるため、actionListenerが起動したときに設定されます。

これは、データテーブルフォームの外部からactionListenerを呼び出したい場合に便利です(値を送信しません)

于 2012-11-19T15:39:52.450 に答える
2

「フォームを送信するときに機能する」というあなたの声明が解決策だと思います。

ページに複数のパネルがあり、最初のパネルが人のリストである場合にも同様の問題が発生しました。誰かが選択されると、詳細が次のパネルに読み込まれます。

そのため、rowSelectリスナーが起動していましたが、Beanの選択は常にnullでした。参考までに、rowSelectリスナーは詳細パネルをラップするap:outputPanelを更新します。詳細パネルは、選択がnullでない場合にのみレンダリングされます。

データテーブルをh:formでラップしたところ、行を選択するだけですべてが機能し始めました。

ここで、BeanにSpring、Session Scoped Componentを使用してデータリストと選択を格納し、rowSelect操作のコントローラーにSpringシングルトンコンポーネントを使用しました。しかし、それでもあなたの例では機能するはずです。

于 2016-10-05T17:16:41.693 に答える
-2
<p:column headerText="Test">
    <h:outputText value="#{v.value}" />
</p:column>

h:outputTextタグを削除し、次のように使用します

<p:column headerText="Test">
    #{v.value}
</p:column>
于 2013-04-19T09:27:40.630 に答える