如何ajax只渲染输入而不是整个表单?

时间:2011-10-18 14:25:17

标签: ajax jsf jsf-2 rerender

我在JSF 2.0中有一个带有大量文本(标签)和复选框的表单。文本永远不会在提交时更新,但复选框值会更新。

例如:

<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 个答案:

答案 0 :(得分:1)

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

您的视图标记无效(看起来您将标签for与输入id混淆),但到目前为止它应如下所示:

<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表达式。如果这是一个动态生成的表单和/或预先在bean中知道ID和复选框的数量,那么你应该可以使用类似的东西:

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