当前位置: 首页 > 知识库问答 >
问题:

primefaces选项卡视图上的tabChange事件未在ManagedBean中设置值

徐学潞
2023-03-14

我在使用PrimeFaces5.0和JSF2.2时遇到了一个问题。5.使用两个选项卡共享同一ManagedBean和同一对象的p:tabView,事件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>

管理豆:

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

}

我尝试了process=“@this”process=“@form”process=“@all”immediate=“true”,但没有成功。我是不是遗漏了什么?提前谢谢。

重要更新:

在花了一些时间调试primefaces代码之后,在类org中。素面。组成部分应用程序编程接口。UITabPanel我意识到,如果Primefaces不是ajax请求的源,则它只在其process()方法中处理子组件:

if(isRequestSource(context)) {
   return;
}

因此,我删除了这段代码并重新编译primefaces,现在它运行良好。我会把这个问题公诸于众,以防有比我更有经验的人找到更好的解决办法。

共有2个答案

沃盛
2023-03-14

在6.0之后

<p:ajax event="*" listener="*" skipChildren="false">

"false"

帮助,并在侦听器函数调用之前将值设置为托管bean

壤驷喜
2023-03-14

试试这个。

xhtml

<?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>

managedbean

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

}
 类似资料:
  • 在我的应用程序中,我想使用一个动态tabView,其中每个选项卡都有一个不同页面的< code>ui:include。我有一个扩展< code>Tab的< code>TabObject列表。< code>TabObject有一个xhtml页面作为字符串属性: 在我的第一次尝试中,我想动态添加选项卡: 但是不适用于使用此技术的变量。到目前为止,我的解决方案是: 这是我的方法: 在事件回调中,我无法获

  • 我有一个左向的Tabview。 我想减少选项卡标题的数量,它们太大了。我该怎么做?

  • 我使用Primeface 3.4.2自动完成。 在ManagedBean中,当我在自动完成中键入字符时选择一行时,我无法在方法{中获取值 这可能是什么原因?理想情况下,当我从自动完成值中选择一行时,我希望填充或填充jsf页面中的其他列。 自动完成的JSF代码 ManagedBean方法

  • 我有一个使用菜单项的tabMenu每个菜单项都有一个参数“I”,该参数链接到activeIndex,以指示单击选项卡时要加载的页面。 我面临的问题是,我需要获取I的这个参数值来调用另一个正在执行操作/处理的小部件。是否有任何方法可以获取I的这个参数值并将其传递给我的widget托管bean(widget包含一个命令按钮,该按钮应该调用widget托管bean中的一个方法,并根据选择的菜单进行一些处

  • [编辑] 类似于分部和模板的复杂嵌套问题 到目前为止,是使用Angulal-UI状态解决方案更好,还是应该坚持使用ng-包括? 到目前为止,我在AngularJS应用程序中每个URL有一个视图。我需要建立一个新的视图,它应该有3个选项卡,我在试图弄清楚如何设计视图架构方面遇到了困难。 请注意,这3个选项卡后面的业务模型对象是相同的。 第一个选项卡用于查看和编辑业务对象上的数据。所以第一个选项卡中已

  • 我使用primeface5.2。我想使用一个动态渲染选项卡的手风琴面板。我的xhtml代码: “existe”值存储在布尔值中,我的问题是它似乎从未在渲染属性中使用过。我得到了这个结果。tab rendered我尝试直接编写它,结果是一样的:选项卡总是呈现的。 你能帮帮我吗?