Я хочу использовать компонент PrimeView TabView для отображения данных с нашего сервера в виде вкладок. Мне нужно три вкладки для отображения трех таблиц с разными данными.Интерфейс TabView с составным компонентом как вкладки
Это работает, если я пишу:
<p:tabView>
<p:tab>
// <p:dataTable> logic comes here
</p:tab>
<p:tab>
// and here
</p:tab>
</p:tabView>
Моя проблема заключается в том, что DataTable логика более или менее то же самое для каждой вкладки. Я не люблю такого рода дублирования кода, поэтому я хотел бы создать пользовательскую вкладку, которая работает следующим образом:
summary.xhtml
<p:tabView>
<my:customTab dataToDisplay="#{myBean.dataSet1}">
<my:customTab dataToDisplay="#{myBean.dataSet2}">
</p:tabView>
Но до сих пор я не suceeded в реализации составной компонент, который работает. Мой подход заключается в создании отдельного файла customTab.xhtml с этим кодом
customTab.xhtml
<ui:composition // namespace definitions
... >
<composite:interface>
<composite:attribute name="dataToDisplay" />
</composite:interface>
<composite:implementation>
<p:tabView>
// dataTable logic comes here
</p:tabView>
</composite:implementation>
</ui:composition>
Но с этим компонентом TabView не показывает никаких вкладок. Вероятно, это так, потому что JSF будет рисовать отдельный компонент для каждого моего: customTab-Tag. Таким образом tabView не увидит, что есть вкладка p: внутри my: customTab. Что мне нужно сделать, чтобы TabView распознал вкладку p: tab внутри моего: customTab?
Ввод компонентов в компоненты компонентов будет действительно опасной задачей, вам нужно будет перекомпилировать прайды с вашим кодом внутри пакета. Предложение @ktwo, вероятно, лучше/более эффективно: это то, что мы сделали, на самом деле мы даже использовали одни и те же данные только новые таблицы на некоторых вкладках. Также используется TabModel, чтобы делать вкладки, а не перечислять их все 1by1 – VeenarM