2012-08-02 67 views
5

Estoy tratando de configurar una tabla de datos con JSF que tenga casillas para el total de filas que sumará el total de la fila enCambio de cualquier casilla de la fila. la fila se ve así:Acción JSF desde onChange

<tr id="input_row_1"> 
<td id="mondayInput1"> 
    <h:inputText id="monday1" size="4" value="#{timesheet.monday1}" required="false" /> 
    <!-- <input name="monday1" class="smallInput" type="number" size="2" maxlength="4" min="0"/> --> 
</td> 
<td id="tuesdayInput1"> 
    <h:inputText id="tuesday1" size="4" value="#{timesheet.tuesday1}" required="false" /> 
    <!--<input name="tuesday1" class="smallInput" type="number" size="2" maxlength="4" min="0"/> --> 
</td> 
<td id="wednesdayInput1"> 
    <h:inputText id="wednesday1" size="4" value="#{timesheet.wednesday1}" required="false" /> 
    <!--<input name="wednesday1" class="smallInput" type="number" size="2" maxlength="4" min="0"/> --> 
</td> 
<td id="thursdayInput1"> 
    <h:inputText id="thursday1" size="4" value="#{timesheet.thursday1}" required="false" /> 
    <!--<input name="thursday1" class="smallInput" type="number" size="2" maxlength="4" min="0"/> --> 
</td> 
<td id="fridayInput1"> 
    <h:inputText id="friday1" size="4" value="#{timesheet.friday1}" required="false" /> 
    <!--<input name="friday1" class="smallInput" type="number" size="2" maxlength="4" min="0"/> --> 
</td> 
<td id="saturdayInput1"> 
    <h:inputText id="saturday1" size="4" value="#{timesheet.saturday1}" required="false" /> 
    <!--<input name="saturday1" class="smallInput" type="number" size="2" maxlength="4" min="0"/> --> 
</td> 
<td id="sundayInput1"> 
    <h:inputText id="sunday1" size="4" value="#{timesheet.sunday1}" required="false" /> 
    <!--<input name="sunday1" class="smallInput" type="number" size="2" maxlength="4" min="0"/> --> 
</td> 
<td> 
    <h:inputText id="total1" size="4" value="#{timesheet.total1}" required="false" /> 
    <!-- <input name="total1" id="total1" type="text" size="5" readonly="readonly" /> --> 
</td> 

por lo que primero se intentó añadir onChange="#{timesheet.setTotal1}" a las entradas de día, pero el evento onChange llama a código Javascript, no java/JSF. ¿Alguien puede ayudar a obtener el total para actualizar?

EDIT: He aceptado la respuesta de BalusC pero es necesario incluir también el atributo event a la etiqueta <f:ajax> a conseguir que funcione, al igual que

<h:inputText id="friday1" size="4" value="#{timesheet.friday1}" maxlength="4" required="false" > 
    <f:ajax event="change" render="total1" listener="#{timesheet.updateTotal1}" /> 
</h:inputText> 

Respuesta

6

De hecho, el atributo onchange se acaba de tratar como una llanura atributo HTML de texto que debe representar una función de controlador JavaScript onchange. Esto no es diferente del HTML "simple". Cualquier expresión EL en ese atributo solo será tratada como expresiones de valor. Vea también el tag documentation.

Según su historial de preguntas, está utilizando JSF 2.x (mencione explícitamente la versión/impl de JSF exacta en las preguntas futuras ya que muchas cosas se hacen de forma diferente en JSF 2.x en comparación con JSF 1.x) . Entonces, simplemente usando la nueva etiqueta JSF 2.0 <f:ajax> debería hacerlo.

<h:inputText ...> 
    <f:ajax listener="#{timesheet.changeTotal1}" render="idOfTotalComponent" /> 
</h:inputText> 

... 

<h:outputText id="idOfTotalComponent" value="#{timesheet.total1}" /> 

con

public void changeTotal1(AjaxBehaviorEvent event) { 
    total1 = ...; 
} 
+0

lo hice, y ahora estoy recibiendo: "javax.servlet.ServletException: Propiedad 'updateTotal1' no se encuentra en el tipo de com.timesheet.Timesheet", como si updateTotal1 es una propiedad en lugar de un método/acción –

+0

En el '', ¿quieres decir? Aparentemente, el espacio de nombres XML de 'f:' taglib no se ha declarado en absoluto. Toda la etiqueta '' sería tratada como "texto sin formato" (léase: cualquier EL se trata como una expresión de valor). – BalusC

+0

Pero ha sido declarado, simplemente no incluí todo el código html –