一尘不染

JSF AJAX验证:execute =“ @ this” render =“ @ form”不一致,取决于先前的请求

ajax

我有一个h:commandLink调用方法,该方法更改绑定到单选输入的属性。

我也有相同验证的表单上的文本输入(required = true)。

如果我离开了文本输入栏,并点击h:commandLinkexecute="@this,从模型属性如预期,因为文字输入从未处理和验证从来没有火灾的单选按钮更新。

但是,如果在一个不同的我首先点击h:commandLinkexecute="@form"然后
与链接execute="@this",确认消息消失,但单选按钮值也 不会 离即使UIInput单选按钮从未处于无效状态的模型更新。

我发现这很烦人execute="@this",因为我的意图@this是迫使所有内容从模型中更新而忽略组件中的所有提交值,因此行为取决于我之前所做的事情,这很令人讨厌。

我怀疑正在发生的事情是这样的:

  • 使用@form,单选按钮和文本都将被处理。
  • 单选按钮有效,因此localValue已设置
  • 整个过程验证阶段由于输入无效的文本而失败,因此localValue保持设置状态,不会被清除或传播到value
  • 唯一的解决方法是显式调用resetValue()或重新处理有问题的组件(例如execute="@this radio"),以清除localValue并允许从bean中刷新。

我的问题是:

  • 我对生命周期的理解正确吗?
  • 我是在做错什么,还是关于JSF的烦人的设计之一?

感觉这可能只是这个问题的另一个例子

发生验证错误后,如何使用PrimeFaces
AJAX填充文本字段?

不幸的是,我觉得最近发现了很多。:-(

下面的代码示例:

<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
 }

阅读 277

收藏
2020-07-26

共1个答案

一尘不染

我对生命周期的理解正确吗?

是。


我是在做错什么,还是关于JSF的烦人的设计之一?

这是JSF的“烦人的设计问题”之一。如我在有关该问题的答复中所述:

回到具体问题,我想这是对JSF2规范的疏忽。当JSF规范强制执行以下命令时,对我们JSF开发人员而言将更加有意义:

  • 当JSF需要通过ajax请求更新/重新呈现输入组件,并且该输入组件不包含在ajax请求的处理/执行中时,则JSF应该重置输入组件的值。

我只记得我是否曾经根据JSF规范进行过报告。编辑:我报告了它:JSF规范发行1060

2020-07-26