JSF在使用f:ajax时没有启动bean setter



这是我上一篇关于页面组件条件呈现的文章的更新。现在,我可以使用f:ajax标记,根据选定的用户输入,有条件地在页面上呈现不同的组件。问题是,当我单击命令按钮时,使用ajax有条件呈现的输入在提交时不会被读取。我猜这是因为当我添加新组件时,整个页面都没有重新绘制,并且提交按钮看不到它们,即使它们在那里。这是我的表单页面的片段(它被包装在h:form标签中):

<h:outputLabel for="selectPersonType" value="Select Type: "/>
<h:selectOneMenu id="selectPersonType" value="#{addPersonBean.personType}" label="Person Type" required="true">
<f:selectItem itemValue=""/>
<f:selectItems value="#{listBean.personTypes}" />
<f:ajax render="results"/>
</h:selectOneMenu>
<h:message for="selectPersonType" style="color: red"/>
</h:panelGrid>
<h:panelGroup id="results">

<h:panelGroup rendered="#{addPersonBean.personType == 'STUDENT'}">
<h:outputLabel for="selectSchoolType" value="School Type: " />
<h:selectOneMenu id="selectSchoolType" value="#{addPersonBean.schoolType}">
<f:selectItems value="#{listBean.schoolTypes}" />
<f:ajax execute="selectSchoolType"/>
</h:selectOneMenu>
</h:panelGroup>

<h:panelGroup rendered="#{addPersonBean.personType == 'PATIENT'}">
<h:outputLabel for="smoker" value="Smoker? " />
<h:selectBooleanCheckbox id="smoker" value="#{addPersonBean.smoker}">
<f:ajax execute="smoker"/>
</h:selectBooleanCheckbox>

</h:panelGroup>
</h:panelGroup>
<h:commandButton value="Add Person" action="#{addPersonBean.action}"/>

这里的问题是,当我单击commandButton时,ID为"selectSchoolType"one_answers"smoker’s values"的组件不会被设置,因为它们是在页面加载后使用selectPersonType选择菜单有条件地呈现的。有没有一种方法可以在组件的值更改时而不是在我单击提交按钮时激发组件(因此,在我甚至单击提交之前都应该处理它们的值)。正如您所看到的,我曾尝试使用带有execute属性的f:ajax,但它似乎不起作用。(我相信这些组件的默认事件是valueChange,所以没有将它们添加到f:ajax标记中,但我尝试过"change"one_answers"valueChange")。

所有<f:ajax>内容都在有条件渲染的组件中。在处理表单提交期间,当rendered属性后面的条件计算为false时,此构造将失败。当#{addPersonBean}在请求范围内,并且在(后)构造期间没有预先初始化rendered属性后面的条件时,或者当它以错误的方式在getters/ssetter中执行业务逻辑时,就会发生这种情况。

#{addPersonBean}放在视图范围中,并确保您没有在getters/ssetter中执行业务逻辑,应该可以解决这个问题。

另请参阅:

  • commandButton/commandLink/ajax操作/监听器方法未调用或输入值未更新-第5点适用于您
  • 如何选择正确的bean作用域

相关内容

最新更新