我有一个tabView,它有3个标签,每个标签中都有一个panelGrid和dataTable,我想从panelGrid向dataTable添加一条记录,当我这样做时,我希望tabView移动到下一个标签,并在第二个选项卡中相同,这很好,但我的问题是当我从dataTable中选择一个记录我想将panelGrid更改为选择的相同信息然后移动到下一个选项卡并在那里编辑信息,只有当我添加一个新记录时,它才能正常工作,但是当我返回并从dataTable中选择另一个数据时,它不会移动到下一个选项卡,我无法弄清楚我做错了什么。
这是我的标签代码:
<h:form id="frmExamBank" widgetVar="accordionPanelWidget">
<p:tabView widgetVar="tabWidget" id="tabsId"
activeIndex="#{mbCoursesExamBank.activeIndexTab}">
<p:tab title="Course Exam Bank" id="tab1">
<ui:include src="/pages/instructors/test.xhtml" />
</p:tab>
<p:tab title="Course Exam Questions" id="tab2" disabled="true">
<ui:include src="/pages/instructors/questions.xhtml" />
</p:tab>
<p:tab title="Course Exam Answers" id="tab3" disabled="true">
<ui:include src="/pages/instructors/answers.xhtml" />
</p:tab>
</p:tabView>
</h:form>
这是我的panelGrid:
<p:panelGrid columns="4" id="pnlCoursesExamBankData">
<f:facet name="header">
<div align="center">#{msg2.get('course_exam_bank')}</div>
</f:facet>
<p:outputLabel value="#{msg2.get('course')}" for="course" />
<p:selectOneMenu id="course" value="#{mbCoursesExamBank.entity.course}"
required="true" converter="omnifaces.SelectItemsIndexConverter"
label="#{msg2.get('course')}" filter="true" filterMatchMode="contains">
<f:selectItems value="#{mbCourses.all}" var="course"
itemLabel="#{course.fullName}" itemValue="#{course}" />
</p:selectOneMenu>
<p:outputLabel value="#{msg2.get('exam_category')}" for="examCategory" />
<p:selectOneMenu id="examCategory"
value="#{mbCoursesExamBank.entity.examCatogory}" required="true"
converter="omnifaces.SelectItemsIndexConverter"
label="#{msg2.get('exam_category')}">
<f:selectItem itemLabel="#{msg2.get('select_category')}"
itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{mbExamCategory.all}" var="category"
itemLabel="#{category.name}" itemValue="#{category}" />
</p:selectOneMenu>
<f:facet name="footer">
<div align="center">
<p:commandButton value="#{msg2.get('add')}"
action="#{mbCoursesExamBank.addCoursesExamBank()}"
update="@parent,@parent:tblCoursesExamBank,frmExamBank:tabsId"
process="@parent:pnlCoursesExamBankData" icon="btn-icon fa fa-plus" />
<p:commandButton value="#{msg2.get('save')}"
action="#{mbCoursesExamBank.update()}"
update="@parent,@parent:tblCoursesExamBank"
process="@parent:pnlCoursesExamBankData"
icon="btn-icon fa fa-floppy-o" />
<p:commandButton value="#{msg2.get('delete')}"
action="#{mbCoursesExamBank.delete()}"
update="@parent,@parent:tblCoursesExamBank"
process="@parent:pnlCoursesExamBankData"
icon="btn-icon fa fa-pencil" />
</div>
</f:facet>
</p:panelGrid>
这是我的dataTable:
<p:dataTable paginatorPosition="bottom" id="tblCoursesExamBank"
value="#{mbCoursesExamBank.all}" var="bank" selectionMode="single"
selection="#{mbCoursesExamBank.entity}" rowKey="#{bank.id}"
rowIndexVar="rowIndex" paginator="true" rows="6">
<p:ajax event="rowSelect"
update="@parent:pnlCoursesExamBankData,frmExamBank,frmExamBank:tabsId"
process="@this" />
<p:column headerText="#" width="10%">
#{rowIndex+1}
</p:column>
<p:column headerText="#{msg2.get('course')}"
filterBy="#{bank.course.name}" sortBy="#{bank.course.name}"
filterMatchMode="contains">
#{bank.course.name}
</p:column>
<p:column headerText="#{msg2.get('exam_catogory')}"
filterBy="#{bank.examCatogory.name}"
sortBy="#{bank.examCatogory.name}" filterMatchMode="contains">
#{bank.examCatogory.name}
</p:column>
</p:dataTable>
答案 0 :(得分:0)
...我的问题是当我选择来自dataTable的记录时......它 只有当我添加新标记时,标签才能正常运行 一,但当我回去并选择来自dataTable的另一个数据 它没有移动到下一个标签......
正如您所发现的,在同一视图中使用多个Primefaces标签可能非常棘手。
在多个选项卡之间进行选择的一种(可能过于复杂的)方法是在页面bean上使用actionListener
。在您的情况下,您可以将侦听器与数据表事件rowSelect
相关联。
在actionListener中,使用Primefaces方法调用客户端:
RequestContext.getCurrentInstance().execute("selectTab(desiredTabNumber)");
请注意,函数名称(selectTab)实际上必须存在于客户端代码中,如下所示:
<script type="text/javascript">
function selectTab(index) {
if(typeof tabWidget != 'undefined') {
tabWidget.select(index);
} else {
alert("Can't select tab " + index);
}
}
</script>
(以下是针对您提出的关于更好或更简单方法的问题的编辑。)
另一种(可能更可靠)方法是不尝试在同一页面上的多个选项卡之间管理模型状态。相反,也许可以使用JSF Flow Scope来设置一系列页面:
JavaServer Faces技术的Faces Flows功能允许您创建一组具有范围FlowScoped的页面,该范围大于请求范围但小于会话范围。例如,您可能希望为在线商店中的结帐流程创建一系列页面。您可以根据需要创建一组可以从一个商店转移到另一个商店的自包含页面。