2012-08-02 5 views
5

Ich versuche, eine Datentabelle mit JSF einzurichten, die Felder für Zeilensumme hat, die die Zeilensumme onChange eines beliebigen Felds in der Zeile summieren. die Zeile wie folgt aussieht:JSF-Aktion von 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> 

so zuerst versuchte ich onChange="#{timesheet.setTotal1}" den Tag Einträge hinzufügen, aber das onChange Ereignis ruft JavaScript aktivieren, nicht java/JSF-Code. Kann jemand helfen, den Gesamtbetrag zu aktualisieren?

EDIT: Ich habe BalusC Antwort aber notwendig, um auch gehören die event Attribut auf den <f:ajax> Tag akzeptiert es, wie so der Tat

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

Antwort

6

an die Arbeit, die onchange Attribut nur als einfacher behandelt wird Text HTML-Attribut, das eine JavaScript onchange Handler-Funktion darstellen sollte. Dies unterscheidet sich nicht von "plain vanilla" HTML. Alle EL-Ausdrücke in diesem Attribut werden nur als Wertausdrücke behandelt. Siehe auch die tag documentation.

Basierend auf Ihrer Frage Geschichte, verwenden Sie JSF 2.x (bitte erwähnen Sie genau die genaue JSF Impl/Version in zukünftigen Fragen, da viele Dinge in JSF 2.x anders als JSF 1.x gemacht werden) . Also, nur mit dem neuen JSF 2.0 <f:ajax> Tag sollte es tun.

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

... 

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

mit

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

tat ich das, und bin jetzt immer: "javax.servlet.ServletException: Anwesen 'updateTotal1' nicht auf Typ com.timesheet.Timesheet gefunden", als ob updateTotal1 eine Eigenschaft eher als eine Methode/Aktion –

+0

Auf dem '', meinst du? Anscheinend wurde der XML-Namespace der 'f:' taglib überhaupt nicht deklariert. Das ganze "" -Tag würde dann tatsächlich als "einfacher Text" behandelt (gelesen: jedes EL wird dann als ein Wertausdruck behandelt). – BalusC

+0

Aber es wurde erklärt, ich habe nicht alle HTML-Code enthalten –