Primefaces数据表中的从属列

时间:2013-12-03 08:04:09

标签: jsf jsf-2 primefaces

我正在使用可编辑的Primefaces p:datatable向用户显示数据。在此数据表中,我有一个p:column h:selectOneMenu,另一个p:selectBooleanCheckbox

我想检查或取消选中并禁用或启用此复选框,具体取决于h:selectOneMenu中选择的值。

如果我只有一个h:selectOneMenu和一个p:selectBooleanCheckbox,我会使用p:ajax将监听器附加到更改事件,并且我会操纵{{1}在这个方法中。但我每行有一对p:selectBooleanCheckboxh:selectOneMenu,我不知道该怎么做。

这就是我的尝试:

p:selectBooleanCheckbox

3 个答案:

答案 0 :(得分:1)

帖子Retrieving other component's client ID in JSF 2.0描述了如何检索页面中其他组件的ID。在我看来,#{p:component('sampleButton')}应该在组件树中找到具有此ID的下一个组件 - 这应该是同一行。

或者,您应该能够通过JSF 2 #{component.parent.clientId}功能重新渲染整行(衡量一下,您需要多少“父”步骤,例如#{component.parent.parent.clientId})。

希望它有所帮助,否则只需添加评论......: - )

答案 1 :(得分:1)

我无法想象为什么你对简单的update="checkboxId"不满意,但你可以尝试通过widgetVar更新组件,你可以在页面渲染过程中生成它。

微小的例子:

<?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://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui">
<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Table Example</title>
</h:head>
<h:body>
    <h:form prependId="false">
        <p:dataTable var="data" value="#{tableBean.data}">
            <p:column headerText="Command">
                <p:commandButton value="Toggle" actionListener="#{tableBean.toggleSelection(data.id)}"
                    update="@widgetVar(tableCheckboxComponent_#{data.id})" />
            </p:column>
            <p:column headerText="Value">
                <h:outputText value="#{data.value}" />
            </p:column>
            <p:column headerText="Selected">
                <p:selectBooleanCheckbox widgetVar="tableCheckboxComponent_#{data.id}" value="#{data.selected}" />
            </p:column>
        </p:dataTable>
    </h:form>
</h:body>
</html>

支持bean:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class TableBean {
    private Map<String, MyData> data;


    public List<MyData> getData(){
        return new ArrayList<MyData>(data.values());
    }

    public TableBean() {
        data = new HashMap<String, MyData>();
        for (int i = 0; i<22; i++) {
            String id = "id" + Integer.toString(i);
            data.put(id, new MyData( id , i));
        }
    }

    public void toggleSelection(String id) {
        MyData myData = data.get(id);
        myData.setSelected(!myData.isSelected());
    }
}

和数据对象:

public class MyData {
    private String id;
    private boolean selected;
    private int value;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }   

    public MyData(String id, int value) {
        this.id = id;
        this.value = value;
        this.selected = false;
    }
}

答案 2 :(得分:0)

我仍然不知道为什么我的方法不起作用。

最后,我在p:ajax组件中添加了一个监听器来操作托管bean中的SelectBooleanCheckbox

<p:ajax listener="#{prescBean.onDrugSelected}" update="autoAmount" />

public void onDrugSelected(AjaxBehaviorEvent event) {
    Drug drug = (Drug) ((UIOutput) event
            .getSource()).getValue();
    boolean hasRules = drug.getRules().size() > 0;

    SelectBooleanCheckbox cbAutoAmount = (SelectBooleanCheckbox) ComponentUtils
            .findComponent(FacesContext.getCurrentInstance().getViewRoot(),
                    "autoAmount");

    cbAutoAmount.setDisabled(!hasRules);
    cbAutoAmount.setValue(hasRules);
}