jsf commandlink и commandbutton с визуализированным атрибутом не запускают actionlistener - PullRequest
1 голос
/ 02 апреля 2012

Я использую простые символы для отображения некоторых данных на странице, и при щелчке по данным типа CLOB я хочу открыть всплывающее окно (с использованием компонента диалога простых лиц) для отображения полных данных.Дело в том, что когда я помещаю визуализированный атрибут в commandlink, он не будет запускать метод при поддержке бина.Он запускает метод правильно, если я не использую предоставленный атрибут.Но он не будет правильно передавать параметры.

Базовый компонент имеет видимость.Может быть, о состоянии бобов теряется, когда я подчиняюсь?Если это так, что нужно сделать, чтобы преодолеть это?

Вот источник:

<p:dataTable id="dynamicDBReaderResultTable"
    widgetVar="wv_dynamicDBReaderResult" paginator="true" page="1"
    rows="10" value="#{controller.data}" var="record"
    paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
    rowsPerPageTemplate="10,25,50,100"
    emptyMessage="#{dtsmsgm['NoRecords']}"
    errorMessage="Error viewing data" rowIndexVar="rownumber" lazy="false"
    dynamic="true">
    <p:column>
        <h:outputText value="#{rownumber+1}"
            style="font-weight:bold; font-size:1.05em" />
    </p:column>
    <p:columns value="#{controller.columnNames}" var="columnName"
        columnIndexVar="columnIndex">
        <f:facet name="header">
            <h:outputText value="#{columnName}" />
        </f:facet>
        <h:outputText value="#{record[columnIndex].toDisplayString()}" />

<p:commandLink id="showDataButton" value="..."
            actionListener="#{controller.prepareLargeData(rownumber,columnIndex)}"
            rendered="#{record[columnIndex].dataType eq '2005'}" //if this attribute is removed, it fires the action, but with both parameters as zero
            onsuccess="dlg.show()">
        </p:commandLink>



    </p:columns>
</p:dataTable>

<p:dialog id="largeDataDialog" header="Large Data Content"
    widgetVar="dlg" closeOnEscape="true" minHeight="150">
    <h:outputText id="largeData" value="#{controller.largeData}" />
</p:dialog>

Backing Bean:

@ManagedBean(name = "dynamicDBReader")
@ViewScoped
public class DynamicDBReader extends AEntityBean<AEntity> {
private List<String> columnNames;
private List<DBData[]> tabularData;
private boolean showTable;
private DBData largeData;


public void prepareLargeData(int rowNumber, int columnIndex) {
    largeData = tabularData.get(rowNumber)[columnIndex];
}

@Override
public void init() {
    reInit();
}

private void reInit() {
    columnNames = new ArrayList<String>();
    tabularData = new ArrayList<DBData[]>();
    selectedRelease = getLastRelease();
    setShowTable(false);
}



public List<DBData[]> getData() {
    return tabularData;
}

public List<String> getColumnNames() {
    return columnNames;
}


/**
 * @param showTable
 *            the showTable to set
 */
public void setShowTable(boolean showTable) {
    this.showTable = showTable;
}

/**
 * @return the showTable
 */
public boolean isShowTable() {
    return showTable;
}

/**
 * @param largeData
 *            the largeData to set
 */
public void setLargeData(DBData largeData) {
    this.largeData = largeData;
}

/**
 * @return the largeData
 * @throws SQLException
 * @throws IOException
 */
public String getLargeData() {
    if (largeData == null) {
        return "";
    }
    try {
        return largeData.toFullString();
    } catch (IOException ioe) {
        String errorMessage = "Failed reading data";
        LogUtil.error(logger, errorMessage, ioe);
    } catch (SQLException sqle) {
        String errorMessage = "Failed reading data";
        LogUtil.error(logger, errorMessage, sqle);
    }
    return "";
}

}

1 Ответ

1 голос
/ 02 апреля 2012

Это может произойти, если значение переменной columIndex изменилось во время запроса HTTP POST отправки формы.Это, в свою очередь, может произойти, если #{controller.columnNames} зависит от условия на основе запроса, которое было корректным только при отображении страницы с таблицей.Вам нужно убедиться, что вы предварительно инициализировали его в (post) конструкторе bean-объекта области видимости и что значение не инициализируется / не обрабатывается в методе getter.

...