我有一个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的显示值仍然是未链接的,有什么问题?
答案 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");
感谢每个人都试图解决我的问题。