Использовать в прослушивателе в теге


Я использую <ui:include> для загрузки таблицы данных (я использую на основе схемы PrimeFaces). Я хочу использовать <ui:param> в listener в теге <p:ajax>. Я проверил код, который не работает, но не вызывает событие onRowEdit или onRowCancel. Это моя страница:

...
<ui:include src="../Componentes/tablaEditable.xhtml">
     <ui:param name="columnas" value="#{tabla2FuentesHL7.dataTableColumns}" />
     <ui:param name="bean" value="#{tabla2FuentesHL7.listTabla2FuenteDTO}" />
     <ui:param name="aceptarEdicion" value="#{tabla2FuentesHL7.onRowEdit}" />
     <ui:param name="cancelarEdicion" value="#{tabla2FuentesHL7.onRowCancel}" />
</ui:include>
...

Моя таблица данных:

<ui:composition 
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">

<h:form >
    <p:dataTable value="#{bean}"  scrollable="true"  scrollHeight="100" var="dato" editable="true">
        <p:ajax event="rowEdit" listener="#{aceptarEdicion}"  />
        <p:ajax event="rowEditCancel" listener="#{cancelarEdicion}"  />
        <c:forEach items="#{columnas}" var="column" varStatus="loop">
            <p:column headerText="#{column.header}" sortBy="#{dato[column.property]}">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{dato[column.property]}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{dato[column.property]}" style="width:100%"  />
                    </f:facet>
                </p:cellEditor>     
            </p:column>
        </c:forEach> 
        <p:column style="width:32px">
            <p:rowEditor />
        </p:column>
    </p:dataTable>
</h:form>

Мой Боб:

@ManagedBean(name = "tabla2FuentesHL7")
@ViewScoped
enter code herepublic class Tabla2FuentesHL7 {

private static final long serialVersionUID = 1L;
private List<DataTableColumn> dataTableColumns = new ArrayList<DataTableColumn>();
private List<Tabla2FuenteDTO> listTabla2FuenteDTO = new ArrayList<Tabla2FuenteDTO>();

@PostConstruct
public void init() {

    listTabla2FuenteDTO = Test.getFuenteTabla2();
    dataTableColumns = CargarTablas.getTabla2FuenteHL7();

}

public List<Tabla2FuenteDTO> getListTabla2FuenteDTO() {
    return listTabla2FuenteDTO;
}

public List<DataTableColumn> getDataTableColumns() {
    return dataTableColumns;
}

public void onRowEdit(RowEditEvent event) {
    FacesMessage msg = new FacesMessage("Elemento modificado");
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

public void onRowCancel(RowEditEvent event) {
    FacesMessage msg = new FacesMessage("Modificación cancelada");
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

public void onCellEdit(CellEditEvent event) {
    Object oldValue = event.getOldValue();
    Object newValue = event.getNewValue();

    if (newValue != null && !newValue.equals(oldValue)) {
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}

}

Это ошибка:

javax.el.PropertyNotFoundException: /Componentes/tablaEditable.xhtml @12,76 listener="#{cancelarEdicion}": /Modulos/hl7.xhtml @31,104 value="#{tabla2FuentesHL7.onRowCancel}": The class 'com.queres.xedoc.consola.componentes.Tabla2FuentesHL7' does not have the property 'onRowCancel'.

Если я изменю это:

<p:ajax event="rowEdit" listener="#{aceptarEdicion}"  />
        <p:ajax event="rowEditCancel" listener="#{cancelarEdicion}"  />

Для этого:

        <p:ajax event="rowEdit" listener="#{tabla2FuentesHL7.onRowEdit}"  />
        <p:ajax event="rowEditCancel" listener="#{tabla2FuentesHL7.onRowCancel}"  />

Мой код работает нормально, но мне нужно динамическая таблица данных. Есть ли способ передать параметр слушателю? Спасибо!

1 4

1 ответ:

<ui:param> может передавать только выражения значений, но не выражения методов.

Лучше использовать способность EL параметризовать имена методов с помощью скобок []. Тогда вы можете просто объявить имена методов как простые vanilla String.

<ui:include src="../Componentes/tablaEditable.xhtml">
     ...
     <ui:param name="beanEdicion" value="#{tabla2FuentesHL7}" />
     <ui:param name="aceptarEdicion" value="onRowEdit" />
     <ui:param name="cancelarEdicion" value="onRowCancel" />
</ui:include>
<p:ajax event="rowEdit" listener="#{beanEdicion[aceptarEdicion]()}"  />
<p:ajax event="rowEditCancel" listener="#{beanEdicion[cancelarEdicion]()}"  />

Update согласно комментариям, он по-прежнему не работает в PrimeFaces 5.1, хотя связанная с ним проблема говорит, что она уже исправлена в 3.5. В принципе, вам нужно будет снова открыть вопрос.

В то же время, вы можете обойти это с помощью <o:methodParam> тег служебной библиотеки JSFOmniFaces . Это в основном преобразует выражение значения в выражение метода:

<ui:include src="../Componentes/tablaEditable.xhtml">
         ...
     <ui:param name="aceptarEdicion" value="#{tabla2FuentesHL7.onRowEdit}" />
     <ui:param name="cancelarEdicion" value="#{tabla2FuentesHL7.onRowCancel}" />
</ui:include>
<o:methodParam name="aceptarEdicionParam" value="#{aceptarEdicion}" />
<o:methodParam name="cancelarEdicionParam" value="#{cancelarEdicion}" />
...
<p:ajax event="rowEdit" listener="#{aceptarEdicionParam}"  />
<p:ajax event="rowEditCancel" listener="#{cancelarEdicionParam}"  />