Отображение правильных данных из группы данных - PullRequest
0 голосов
/ 17 февраля 2012

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

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

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Основной подход заключается в том, чтобы атрибут 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 голосов
/ 22 февраля 2012

Благодатью Божьей. После большой борьбы! я наконец достиг этого !
За это я благодарю 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

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

изображение http://s19.postimage.org/kt8xiy80z/image.png

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

...