从侦听器方法更改inputText值

时间:2012-09-28 18:41:07

标签: jsf-2

我有一个inputText:

<h:inputText id="result" value="#{guessNumber.result}"/>

和另一个inputText:

<h:inputText id="name" value="#{guessNumber.named}" onchange="submit()" valueChangeListener="#{guessNumber.processValueChange}"/>

并且在processValueChange方法中,我添加了以下行:

result = "hello";

但是“result”inputText的显示值仍然是未链接的,有什么问题?

2 个答案:

答案 0 :(得分:10)

valueChangeListener方法无意以这种方式更改模型。它的目的是聆听模型值的实际变化,恰好在您拥有两个旧模型和新模型值的那一刻。例如,执行一些日志记录。它在验证阶段结束时运行,在之前更新模型值阶段。因此,在更新模型值阶段,您将在侦听器方法中对模型值您自己所做的任何更改都将被覆盖。

您需要<f:ajax listener>。这在调用操作阶段期间运行,更新模型值阶段之后

<h:outputText id="result" value="#{guessNumber.result}" />
<h:inputText id="name" value="#{guessNumber.named}">
    <f:ajax listener="#{guessNumber.namedChanged}" render="result" />
</h:inputText>

(请注意,我已删除了onchange="submit()" JavaScript处理程序!)

public void namedChanged(AjaxBehaviorEvent event) {
    result = "Hello, you entered " + named;
}

(参数是可选的;如果你不需要它,只需省略它)

另见:

答案 1 :(得分:1)

我找到了解决方案: 我没有将inputText的 value 属性绑定到bean内的String属性(result),而是将inputText绑定到bean内的UIInput属性:

<h:inputText id="result" binding="#{guessNumber.result}"/>

并在bean中:

private UIInput result = null;

这使侦听器方法可以直接修改inputText ,而不是修改绑定到inputText的 value 属性的属性:

result.setValue("Hello");

感谢每个人都试图解决我的问题。