2011-10-18 52 views
1

我在JSF 2.0中有很多文本(标签)和复选框。提交时文本从不更新,但复选框的值确实如此。如何ajax只呈现输入而不是整个表单?

例如:

<h:form> 

    <h:outputLabel value="bla bla bla bla .. X 1000" id="lab1"> 
    <h:selectBooleanCheckbox for="lab1"> 

    <h:outputLabel value="bla bla bla bla .. X 1000" id="lab2"> 
    <h:selectBooleanCheckbox for="lab2"> 

    .... many more labels and checkboxes ... 

    <h:commandButton> 
     <f:ajax render="@form" execute="@form" /> 
    </h:commandButton>  

</h:form> 

的问题是,每当我做了提交,整个表单内容被重新呈现。我想只是复选框值重新呈现。这可以节省90%的请求大小。

是否有解决此问题的好方法?

回答

1

render属性接受空格分隔的多个组件ID的字符串。您可以在render属性中指定所需输入的组件ID,而不是整个@form

你的看法标记是无效的(看起来像你的输入id困惑标签for),但到了点就应该是这样的:

<h:outputLabel value="bla bla bla bla .. X 1000" for="lab1"> 
<h:selectBooleanCheckbox id="lab1"> 

<h:outputLabel value="bla bla bla bla .. X 1000" for="lab2"> 
<h:selectBooleanCheckbox id="lab2"> 

.... many more labels and checkboxes ... 

<h:commandButton> 
    <f:ajax execute="@form" render="lab1 lab2 lab3 lab4 ..." /> 
</h:commandButton>  

注意,它接受一个EL表达式为好。如果这是一个动态生成的表单和/或ID和复选框的数量在bean事先知道,那么你应该能够使用类似:

<f:ajax execute="@form" render="#{bean.allCheckboxIds}" /> 
+0

谢谢!我混淆了属性(仅作为示例编写)。 – Ben

+0

说,我可以在render属性中使用JAVASCRIPT表达式吗? (是的,我会自动构建一个javascript var,其中包含表单中所有复选框和输入的ID) – Ben

+0

不,您不能。这完全是服务器端的评估。如果你想从管理bean中分离责任并以其他形式重用它,你最好可以为它创建一个自定义的EL函数。或者可能创建一个自定义的ajax标签,但这并不是微不足道的。 – BalusC

相关问题