簡體   English   中英

Primefaces Datatable不會更新選定的行

[英]Primefaces Datatable doesnt update selected rows

我有一個簡單的問題。 我有一個Primefaces數據表。 當用戶單擊一行時,我希望更新輔助bean中的選定行屬性。 如果提交了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>

支持Bean:

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>

然而,這仍然無法調用setter setSelectedValues(); 我讓他們也說:

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

這只在點擊一行時調用了getter。 有任何想法嗎?

您可以在<p:ajax>使用rowSelect事件。

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

然而,這在這種背景下沒有多大意義。 如果你想在它上面掛一個listenerupdate屬性,那就更有意義了。 例如

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

如果你想掛鈎取消選擇行,請添加另一個掛在rowUnselect上的rowUnselect

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

也可以看看:

只需在數據表中添加<p:ajax event="rowSelect" />

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

這將在您的支持bean中調用setSelectedEntity(),因此您可以在actionListener觸發時設置它

如果要從數據表格外部調用actionListener(不提交值),這非常有用

我相信你的陳述“在提交表格時起作用”是解決方案。

我有一個類似的問題,我的頁面有多個面板,第一個面板是人員列表,一旦選擇某人,詳細信息將在以下面板中加載。

所以我的rowSelect監聽器正在觸發,但我的bean總是為我的選擇而為null。 僅供參考,我的rowSelect Listener更新了ap:outputPanel,它包裝了我的細節面板。 僅當選擇不為空時才會呈現我的詳細信息面板。

我只是用h:form包裝了數據表,一切都開始工作,只需選擇一行。

現在我使用Spring,Session Scoped Component為我的bean提供數據列表和選擇,並使用Spring singleton Component為我的控制器進行rowSelect操作。 但它應該仍然適用於你的例子。

<p:column headerText="Test">
    <h:outputText value="#{v.value}" />
</p:column>

刪除h:outputText標記,使用如下

<p:column headerText="Test">
    #{v.value}
</p:column>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM