Richfaces: изменение значения атрибута рендеринга компонента с помощью a4j: поддержка в extendedDataTable - PullRequest
4 голосов
/ 25 октября 2010

Я пытаюсь использовать richfaces extendedDataTable с поддержкой a4j: для изменения значения атрибута rich: panel 'rendered', но оно не работает.

Это часть моей JSF-страницы, которая содержит rich: extendedDataTable и rich: panel:

<h:form id="tabForm">
<rich:extendedDataTable id="myTable" width="500px" height="250px"
value="#{extDataTableBean.extList}" var="dataRow"
selection="#{extDataTableBean.selection}" selectionMode="single">
    <rich:column>
        <f:facet name="header"><h:outputText value="ID" /></f:facet>
        <h:outputText value="#{dataRow.id}"></h:outputText>
    </rich:column>
    <rich:column>
        <f:facet name="header"><h:outputText value="Name" /></f:facet>
        <h:outputText value="#{dataRow.name}"></h:outputText>
    </rich:column>
    <a4j:support id="myTableTakeSelection" action="#{extDataTableBean.takeSelection}" event="onselectionchange" reRender="pane" />
</rich:extendedDataTable>
</h:form>
<rich:panel id="pane" rendered="#{extDataTableBean.showPane}">
<h:form id="secForm">
    <h:outputText value="ID : " />
    <h:inputText id="inTextID"  value="#{extDataTableBean.idFd}" />
    <br/>
    <h:outputText value="Name : " />
    <h:inputText id="inTextName" value="#{extDataTableBean.nameFd}" />
</h:form>
</rich:panel>

Значением по умолчанию атрибута rich: panel 'rendered' является false (устанавливается в компоненте поддержки). Я хотел добиться того, чтобы при выборе строки в extendedDataTable ее значение изменялось на true, чтобы его можно было видеть в графическом интерфейсе.

И это часть моего боба:

/* Constructor */
public ExtDataTableBean(){
    setShowPane(false); // default to false
    loadDataList();
}

/* Load some test data into extendedDataTable */
public void loadDataList(){
    extList = new ArrayList<MyData>();
    MyData e1 = new MyData();
    e1.setId(1);
    e1.setName("name 1");
    extList.add(e1);
    MyData e2 = new MyData();
    e2.setId(2);
    e2.setName("name 2");
    extList.add(e2);
}

public String takeSelection(){
    Iterator iterator = getSelection().getKeys();
    Object key = null;
    while(iterator.hasNext()){
        key = iterator.next();
    }
    /* set the values of inputText with value from selected row */
    setIdFd(extList.get(Integer.parseInt(key.toString())).getId());
    setNameFd(extList.get(Integer.parseInt(key.toString())).getName());
    setShowPane(true);
    return null;
}

public List<MyData> getExtList() {
            /* Lazy loading */
    if(extList == null){
        loadDataList();
    }
    return extList;
}

В методе takeSelection () я установил setShowPane (true), чтобы изменить значение атрибута rich: panel 'rendered' на true. Проблема в том, что при выделении строки панель не отображается в графическом интерфейсе.

Я сделал еще один простой тест, добавив h: commandButton с a4j: support, чтобы установить showPane в true, как здесь:

<h:commandButton id="cmdBtn" value="Show Pane">
    <a4j:support id="cmdBtnSupport" reRender="pane" action="#{extDataTableBean.dispPane}" event="onclick" />
</h:commandButton>

и в бобе:

public String dispPane(){
    setShowPane(true);
    return null;
}

и работает как положено. rich: панель отображается в графическом интерфейсе после нажатия кнопки.

Что я упустил в своем коде?

Ответы [ 2 ]

3 голосов
/ 26 октября 2010

Я думаю, что нашел причину проблемы с этого сайта: http://community.jboss.org/wiki/CommonAjaxRequestsProblems#conditionalRendering

Выписка из той части, в которой описана проблема:

Обновления на стороне клиента:

Атрибут reRender не должен указывать на условно отображаемые элементы, потому что среда не знает, куда добавить элемент, которого раньше не было в DOM. Родители таких компонентов должны быть обновлены.

Итак, после того, как я изменил деталь, подлежащую повторной визуализации, и привязал ее к следующему, он теперь работает:

<rich:panel id="pane" >
    <h:form id="secForm" rendered="#{extDataTableBean.showPane}" >
        <h:outputText value="ID : " />
        <h:inputText id="inTextID"  value="#{extDataTableBean.idFd}" />
        <br/>
        <h:outputText value="Name : " />
        <h:inputText id="inTextName" value="#{extDataTableBean.nameFd}" />
    </h:form>
</rich:panel>
0 голосов
/ 25 октября 2010

<rich:extendedDataTable> с поддержкой Ajax из коробки. Нет необходимости добавлять тег <a4j:support>, который предназначен для предоставления функциональности ajax компонентам JSF, отличным от ajax, таким как <h:inputText>.

Итак, попробуйте это вместо:

<rich:extendedDataTable onselectionchange="#{extDataTableBean.takeSelection}">

Удачи.

...