jsf - 素面 tabView 上的 tabChange 事件不会在 ManagedBean 中设置值

标签 jsf jsf-2 primefaces

我在使用 primefaces 5.0 和 jsf 2.2.5 时遇到了问题。用一个 p:tabView 两个选项卡共享相同的 ManagedBean 和相同的对象事件 tabChange没有按预期工作。当用户更改选项卡时,我想执行与他单击按钮相同的验证,但事件并未刷新 bean 值,但是正在发布这些值。我能够用这个简单的例子重现这个问题。
xhtml代码:

<h:body>
    <div class="well">
        <h:form id="testeForm">
            <p:tabView id="tView">
                <p:ajax event="tabChange" 
                        process="@this" 
                        update="@form"
                        listener="#{testeBean.onTabChange}" />
                <p:tab id="tab1" title="tab1">
                    <p:inputText id="teste1" 
                                 value="#{testeBean.evento.nome}" />
                    <p:commandButton id="savetab1" 
                                     process="tab1" 
                                     update="@form"
                                     actionListener="#{testeBean.saveTab1}" 
                                     value="salvarTab1">
                    </p:commandButton>
                </p:tab>
                <p:tab id="tab2" title="tab2">
                    <p:inputText id="teste2" 
                                 value="#{testeBean.evento.descricao}" />
                    <p:commandButton id="savetab2" 
                                     process="tab2" 
                                     update="@form"
                                     actionListener="#{testeBean.saveTab2}" 
                                     value="salvarTab2">
                    </p:commandButton>
                </p:tab>
            </p:tabView>
        </h:form>
    </div>
</h:body>

托管Bean:
package com.example.bean;
@ViewScoped
@ManagedBean(name = "testeBean")
@Getter
@Setter
public class TesteBean {

private Evento evento;

@PostConstruct
public void init() {
    evento = new Evento();
}
public void saveTab1() {
    System.out.println(evento);
}

public void saveTab2() {
    System.out.println(evento);
}

public void onTabChange(TabChangeEvent evt) throws LoundScreenException {
    System.out.println(evt.getTab().getId());
    System.out.println(evento);
}

}

发布的值(value):
inputText posted

我试过 process="@this" process="@form" process="@all" immediate="true" 没有成功。我在这里错过了什么吗?
提前致谢。

重要更新:

在花了一些时间调试 primefaces 代码后,在类 org.primefaces.component.api.UITabPanel 中我意识到 Primefaces 只在它的 process() 方法中处理子组件,如果它不是 ajax 请求的来源:
if(isRequestSource(context)) {
   return;
}

所以我删除了这段代码并重新编译了primefaces,现在它可以正常工作了。我会打开这个问题,以防万一比我更有经验的人找到更好的解决方案。

最佳答案

尝试这个。

html

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <f:facet name="first">
            <meta http-equiv="Content-Type" 
                  content="text/html; charset=UTF-8" />
            <meta name="viewport" 
                  content="user-scalable=no, 
                  width=device-width, 
                  initial-scale=1.0, 
                  maximum-scale=1.0"/>
        </f:facet>

        <title>page2</title>
    </h:head>

    <h:body>
        <h:form id="testeForm">
            <p:remoteCommand name="rc" 
                             process="@this,tView:teste1,tView:teste2" 
                             update="tView:teste1,tView:teste2" 
                             actionListener="#{testeBean.execute}" />
            <p:tabView id="tView" onTabChange="rc()">
                <p:tab id="tab1" title="tab1">
                    <p:inputText id="teste1" 
                                 value="#{testeBean.evento.nome}" />
                    <p:commandButton id="savetab1" 
                                     process="tab1" 
                                     update="@form"
                                     actionListener="#{testeBean.saveTab1}" 
                                     value="salvarTab1">
                    </p:commandButton>
                </p:tab>
                <p:tab id="tab2" title="tab2">
                    <p:inputText id="teste2" 
                                 value="#{testeBean.evento.descricao}" />
                    <p:commandButton id="savetab2" 
                                     process="tab2" 
                                     update="@form"
                                     actionListener="#{testeBean.saveTab2}" 
                                     value="salvarTab2">
                    </p:commandButton>
                </p:tab>
            </p:tabView>
        </h:form>
    </h:body>
</html>

托管bean
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
/**
 *
 * @author Wittakarn
 */
@ViewScoped
@ManagedBean(name = "testeBean")
public class TesteBean implements Serializable{

    private Evento evento;

    public TesteBean(){
        evento = new Evento();
    }

    @PostConstruct
    public void init() {

    }

    public void saveTab1() {
        System.out.println(evento.getNome());
        System.out.println(evento.getDescricao());
    }

    public void saveTab2() {
        System.out.println(evento.getNome());
        System.out.println(evento.getDescricao());
    }

    public void execute() {
        System.out.println(evento.getNome());
        System.out.println(evento.getDescricao());
    }

    public Evento getEvento() {
        return evento;
    }

    public void setEvento(Evento evento) {
        this.evento = evento;
    }

}

关于jsf - 素面 tabView 上的 tabChange 事件不会在 ManagedBean 中设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26362345/

相关文章:

java - 使用 <h :selectManyMenu> in JSF? 提交数据后出错

由于添加函数导致 Java 堆空间错误

java - Eclipse 之外的 Tomcat 6 上的 JSF PropertyNotFound 异常

jsf-2 - Richfaces 未定义 javascript 错误

ajax - 如何使用 p :ajax to update several components in order

jquery - 在不修改 JAR 的情况下升级 primefaces.jar 中的 jquery.js

jsf-2 - PF筛选包含日期的数据表列

jsf - 如何将参数从模板客户端传递给主模板,然后在复合属性中使用它?

java - hibernate 查询中来自 HashMap 的任意 'columns'

java - Primefaces DialogFramework Growl 和 showMessageInDialog 不工作