2012-02-16 7 views
0

Ссылаясь на сообщение this на форуме поверхностей.
Есть ли у кого-нибудь идеи, как мы можем использовать несколько данных на одной странице, но только отображать их правильно?
Моя проблема заключается в том, что у меня есть объект с областью видимости, свойства которого содержат данные из разных таблиц из базы данных. У меня есть несколько данных для данных каждой таблицы базы данных. Теперь я хочу отобразить значение datatable на основе значения, выбранного из <p:selectOneMenu> (окруженный красным цветом).
этот снимок экрана объяснил бы немного дальше.Отображение правильного типа данных из группы данных

image http://s19.postimage.org/qxugwevxf/image.jpg

+1

Какая правильная дата? Условный рендеринг является стандартным в jsf. –

+0

Прошу прощения. Я новичок в JSF, поэтому не знал, как изменить видимость выбранного типа данных. –

+0

Кстати, я обновил свой вопрос –

ответ

2

Основной подход должен был бы позволить атрибут таблиц rendered зависят от выбранного пункта меню.

<p:selectOneMenu value="#{bean.table}"> 
    <f:selectItem itemValue="players" itemLabel="Players" /> 
    <f:selectItem itemValue="jobs" itemLabel="Jobs" /> 
    <f:selectItem itemValue="business" itemLabel="Business" /> 
    ... 
    <p:ajax update="tables" /> 
</p:selectOneMenu> 

<h:panelGroup id="tables"> 
    <p:dataTable value="#{bean.players}" rendered="#{bean.table == 'players'}"> 
     ... 
    </p:dataTable> 
    <p:dataTable value="#{bean.jobs}" rendered="#{bean.table == 'jobs'}"> 
     ... 
    </p:dataTable> 
    <p:dataTable value="#{bean.business}" rendered="#{bean.table == 'business'}"> 
     ... 
    </p:dataTable> 
    ... 
</h:panelGroup> 

Это легко осуществить, но вы в конечном итоге с большим количеством кода в представлении (который, конечно, может быть разделен более <ui:include> файлов). Более продвинутый и многоразовый подход будет состоять в том, чтобы позволить value отдельной таблицы зависеть от выбранного элемента меню и использовать <p:columns> для динамического генерации столбцов.

<p:selectOneMenu value="#{bean.table}"> 
    <f:selectItems value="#{bean.tables}" /> 
    <p:ajax listener="#{bean.changeModel}" update="table" /> 
</p:selectOneMenu> 

<p:dataTable id="table" value="#{bean.model}" var="item"> 
    <p:columns value="#{bean.columns}" var="column"> 
     <h:outputText value="#{item[column]}" /> 
    </p:columns> 
</p:dataTable> 

что-то вроде:

public void changeModel() { 
    model = populateModelBasedOn(table); 
    columns = populateColumnsBasedOn(table); 
} 

Это позволяет только менее детализированный контроль всякий раз, когда вы хотите добавить более специализированных столбцов. Возможно, вам захочется работать с файлами тегов.

+0

Спасибо за ваш ответ.Мое фактическое намерение состояло в том, чтобы сделать все, что вы упомянули. Пожалуйста, предложите мне, какой подход был бы более полезным? файл тегов, составные компоненты или изменение модели таблицы на основе выбранного значения? –

+0

В моем вопросе я упомянул [Сообщение] (http://forum.primefaces.org/viewtopic.php?f=3&t=18365&p=57049#p56921) на форуме с разделами, в котором кто-то сказал мне: «Или вы используете много данных, но с rendered =" # {myBean.condition} ", чтобы показать только правильный datatable =) Смешивание его с помощью ui: include + ui: params, у вас есть только один код для одного и того же типа datatable! " скажите, пожалуйста, как я могу это достичь? –

0

По милости Божьей. После долгих битв! i наконец достигнуто this!
Для этого я плачу благодарность BalusC за его советы экспертов
Так что я хотел бы поделиться своим решением со всеми.
Так вот что я сделал в моем файле Xhtml:

<p:selectOneMenu value="#{dbmBean.selectedTable}" style="height:27px" > 
    <c:forEach items="#{dbmBean.tableNames}" var="table"> 
     <f:selectItem itemLabel="#{table.value}" itemValue="#{table.key}"/> 
    </c:forEach> 
</p:selectOneMenu> 
<p:commandButton value="Go" action="#{dbmBean.goToTable}" ajax="false" /> 
... 
<p:dataTable binding="#{dbmBean.table}" var="row" rowIndexVar="index"> 
<f:facet name="header"/> 
<p:columns value="#{dbmBean.columns}" var="column" columnIndexVar="colIndex" > 
     <f:facet name="header"> 
      #{column.header} 
     </f:facet> 
     <h:outputText value="#{row[column.property]}"/> 
    </p:columns> 
</p:dataTable> 

и в бэк-боба:

public class DatabaseManagerBean implements Serializable { 
    private List<ColumnModel> columns; // Column model is a simple class with two string properties: header, property 
    ...  
    public void goToTable() { 
     int tableIndex = new Integer(this.selectedTable); 
     switch (tableIndex) { 
      case 1: 
       Players tempPlayers = new Players(); //the class which get data from a database table 
       this.players = tempPlayers.getAllPlayers(); 
       this.columnNames = tempPlayers.getColumnNames(); 
       for (String colName : columnNames) { 
        columns.add(new ColumnModel(colName.toUpperCase(), colName)); 
       } 
       table.setRendered(true); 
       table.setValue(this.players); 
       break; 
       ... 
       default: 
       table.setRendered(false); 
     } //end of switch statement 
    } //end of goToTable() method 
} //end of DatabaseManagerBean 

Этот фрагмент кода будет работать именно так, как я хотел в этом скриншоте! :-)

image http://s19.postimage.org/kt8xiy80z/image.png

Кроме того, если кто-то найти что-то осталось необъясненным или отсутствует, пожалуйста, напишите комментарий.
И снова шляпы на BalusC. Потому что без его намеков я не смогу достичь этой цели. :-)
Я также хотел бы поблагодарить Optimus Prime и команду PrimeFaces за создание таких замечательных Faces. :-)
Я также благодарю команду Stackoverflow за то, что предоставил нам такую ​​замечательную платформу для таких обсуждений! :-)
спасибо вам всем! :-)