我在使用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,现在它运行良好。我会把这个问题公诸于众,以防有比我更有经验的人找到更好的解决办法。
试试这个。
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我尝试直接编写它,结果是一样的:选项卡总是呈现的。 你能帮帮我吗?