【问题标题】:Ajax for valueChangeListener用于 valueChangeListener 的 Ajax
【发布时间】:2013-01-22 21:32:31
【问题描述】:

我正在使用p:ajax 侦听器来处理值更改事件(因为valueChangeListener 在表单提交时启动):

<p:ajax event="change" listener="#{bean.onNameChanged}"/>

处理方法:

public void onNameChanged(final AjaxBehaviorEvent event)

问题是,我在AjaxBehaviorEvent 及其类层次结构中都找不到读取输入的旧值 的位置。我也无法在 google 中找到提示,如何获取旧值...

如何访问p:ajax onChange事件中的旧值?

【问题讨论】:

    标签: ajax jsf jsf-2 primefaces onchange


    【解决方案1】:

    您可以尝试以下方法:

    1. 在您的 bean 中实现值更改事件

       public void processValueChange(ValueChangeEvent e){
       //foo the bar
       }
      
    2. 在你的选择组件上定义一个valueChangeListener

       <p:selectOneMenu value="#{yourBean.value}" onchange="submit()" valueChangeListener="{#yourBean.processValueChange}">
      

      其中的关键部分是submit() 位,该位在值更改时处理封闭形式。然后,您可以根据需要 getNewValue() 和 getOldValue()。

    编辑:现在我想了想,我认为你没有理由不能让你的设置保持原样并简单地定义valueChangeListener。还是应该在&lt;p:ajax/&gt;中的change事件期间处理的,其实是在ajax事件本身的监听之前处理的。

    【讨论】:

    • 不,提交不能完成(因为验证)并且更改字段后必须对其他组件可见,所以不是解决方案)
    • @lechlukasz:您可以按照 kolossus 答案的“编辑”部分中的说明进行部分提交。然后 valueChangeListener 将被调用,您可以访问旧值和新值。不会评估/处理所有其他表单元素(除非您将其放在 ajax 调用的 execute 属性中。)
    • 不幸的是,valueChangeListener 在 p:ajax 之前被调用,所以我没有来自该方法中表单的实际数据,所以理论上我可以使用 valueChangeListener 来记住旧值,然后等待 p: ajax 来处理...
    【解决方案2】:

    ValueChangeListener 应该这样工作:

    观点:

    <h:form>
      <h:inputText value="#{sessionBean.hello}" 
                   valueChangeListener="#{sessionBean.valueChangeListener}">
        <p:ajax/>
      </h:inputText>
    </h:form>
    

    豆子:

    public void valueChangeListener(ValueChangeEvent e) {
      System.out.println("valueChangeListener invoked:" 
                          + " OLD: " + e.getOldValue() 
                          + " NEW: " + e.getNewValue());
    }
    

    如果我将文本字段从“hello”更改为“world”,上面的代码将打印出来:

    valueChangeListener 调用:OLD: hello NEW: world

    【讨论】:

    • 您知道如何使 bean 更改也对服务器代码可见吗?使用 p:ajax 我有进程选项,可以发送 UI 控件的内容,这样它们就处于上次提交的状态...
    • @lechlukasz:看看 BalusC 的回答。
    【解决方案3】:

    问题是,我在 AjaxBehaviorEvent 及其类层次结构中都找不到读取输入旧值的位置。我也无法在 google 中找到提示,如何获取旧值...

    使用valueChangeListener。


    不幸的是,valueChangeListener 在 p:ajax 之前被调用,所以我没有来自该方法中表单的实际数据,所以理论上我可以使用 valueChangeListener 来记住旧值,然后等待 p:ajax进程...

    将值更改事件排队到调用应用程序阶段。

    public void valueChangeListenerMethod(ValueChangeEvent event) {
        if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
            event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            event.queue();
            return;
        }
    
        // Do your original job here. 
        // It will only be invoked when current phase ID is INVOKE_APPLICATION.
    }
    

    【讨论】:

    • +1,有人应该做“BalusC IS AWESOME”视频(就像“PEOPLE ARE AWESOME”视频一样)
    • Bauke 你是个了不起的家伙 :D 你刚刚为我节省了几个小时的挠头时间。
    • 像往常一样,BalusC 在我拥有它之前就已经为我解决了问题。
    • @BalusC,谢谢你的回答,'JSF 是宗教-BalusC 是上帝。'
    【解决方案4】:

    你可以用这个:

    public void onNameChanged(AjaxBehaviorEvent event)
     {
        String myVal = (String) ((UIOutput) event.getSource()).getValue();
        System.out.println("myVal: " + myVal);
     }
    

    【讨论】:

    • OP 对“旧 值”感兴趣,因为它在更新模型值阶段已经发生。然而,ajax 侦听器在 更新模型值阶段运行。请参阅当前接受的答案以了解正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2013-05-09
    • 2014-02-19
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多