我有一个h:commandLink
调用一个方法来改变绑定到无线电输入的属性。
我在同一表格上也有一个文字输入,有一些验证(required = true)。
如果我将文本输入留空,并使用h:commandLink
单击execute="@this
,则单选按钮会根据预期从模型属性更新,因为文本输入永远不会被处理,并且验证永远不会触发。 / p>
但是,如果首先点击其他h:commandLink
execute="@form"
,然后与execute="@this"
的链接,验证消息就会消失,但是单选按钮即使单选按钮的UIInput从未处于无效状态,值也会从模型中而不是更新。
我发现execute="@this"
的行为方式有所不同,这取决于我以前做过的事情,当我@this
的意图是迫使所有内容从模型更新并忽略任何提交的值时组件。
我怀疑发生的事情是这样的:
@form
,单选按钮和文本都已处理。 localValue
localValue
仍然设置且未被清除或传播到value
resetValue()
或重新处理有问题的组件(例如execute="@this radio"
)以清除localValue
然后允许从bean中刷新我的问题是:
感觉这可能只是这个问题的另一个例子
How can I populate a text field using PrimeFaces AJAX after validation errors occur?
不幸的是,我觉得我最近发现了很多这些。 : - (
下面的代码示例:
<h:form>
<h:messages/>
Radio =
<h:selectOneRadio value="#{testBean.radioValue}" id="radio" binding="#{radio}">
<f:selectItem itemValue="foo" itemLabel="Foo"/>
<f:selectItem itemValue="bar" itemLabel="Bar"/>
</h:selectOneRadio>
<br></br>
radio bean value = <h:outputText value="#{testBean.radioValue}"/>
<br></br>
radio UIInput localValue = <h:outputText value="#{radio.localValue}"/>
<br></br>
radio UIInput value = <h:outputText value="#{radio.value}"/>
<br></br>
String w/validation = <h:inputText value="#{testBean.stringValue}" required="true" />
<br></br>
<ul>
<li>
<h:commandLink actionListener="#{testBean.changeRadioValue}" value="execute = @form">
<f:ajax render="@form" execute="@form"/>
</h:commandLink>
</li>
<li>
<h:commandLink actionListener="#{testBean.changeRadioValue}" value="execute = @this">
<f:ajax render="@form" execute="@this"/>
</h:commandLink>
</li>
<li>
<h:commandLink actionListener="#{testBean.changeRadioValue}" value="execute = @this radio">
<f:ajax render="@form" execute="@this radio"/>
</h:commandLink>
</li>
</ul>
</h:form>
这个豆子:
@ManagedBean
@ViewScoped
public class TestBean {
private String radioValue = "foo";
private String stringValue;
public void changeRadioValue() {
radioValue = "bar";
}
// + getters/setters
}
答案 0 :(得分:6)
我对生命周期的理解是正确的吗?
是
我做错了什么,或者这是关于JSF的烦人设计事情之一?
这是JSF的“烦人的设计之物”之一。正如我在该相关问题的答案中所述:
回到具体问题,我想这是JSF2规范中的疏忽。当JSF规范要求以下内容时,JSF开发人员会更有意义:
- 当JSF需要通过ajax请求更新/重新呈现输入组件,并且该输入组件未包含在ajax请求的进程/执行中时,JSF应该重置输入组件的值。
如果我曾经针对JSF规范报告此事,我只是不记得了。编辑:我报告了它:JSF spec issue 1060。