2015-03-17 6 views
4

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

... 
<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}" /> 

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

ответ

7

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

Лучше использовать способность EL параметризовать имена методов через скобки [] обозначение. Затем вы можете просто объявить имена методов как простые ваниль 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, даже несмотря на то, related issue говорит, что это уже зафиксировано в 3.5. Вам в основном нужно будет снова открыть проблему.

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

<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}" /> 
+0

Спасибо за ваш ответ, но я не могу заставить его работать. Теперь у меня есть эта ошибка: 'javax.el.PropertyNotFoundException: Target Unreachable, идентификатор 'beanEdicion' разрешен null' –

+0

Какая версия PF? Это известная проблема в '' и должна быть уже исправлена ​​в 5.x. См. Также соответствующий вопрос: http://stackoverflow.com/questions/10691636/facelet-tag-parameter-not-recognized-by-primefaces-pajax – BalusC

+0

Я использую JSF 2.1.11 и Primefaces 5.1. Еще раз спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^