【问题标题】:Change inputText value from listener method从侦听器方法更改 inputText 值
【发布时间】:2012-09-20 16:02:12
【问题描述】:

我有一个 inputText:

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

还有另一个inputText:

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

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

result = "hello";

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

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

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

    您需要&lt;f:ajax listener&gt;。这在调用操作阶段运行,该阶段在更新模型值阶段之后

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

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

    另见:

    【讨论】:

    • 你好 BalusC,我尝试了你的建议,但仍然没有用,当“name” inputText 失去焦点时没有任何反应,namedChanged 方法中包含的唯一行是:result = "hello";
    • 这应该是公认的答案。绑定有点棘手,可能会给您带来麻烦。
    【解决方案2】:

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

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

    在 bean 中:

    private UIInput result = null;
    

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

    result.setValue("Hello");
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2015-05-10
      • 2019-05-14
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多