4

我有一个输入文本:

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

和另一个输入文本:

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

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

result = "hello";

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

4

2 回答 2

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

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

也可以看看:

于 2012-09-28T19:01:39.323 回答
3

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

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

在 bean 中:

private UIInput result = null;

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

result.setValue("Hello");

感谢每一位试图解决我的问题的人。

于 2012-09-29T09:11:48.980 回答