Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > проблемы с primefaces


Автор: anti_snayper 27.5.2010, 10:40
Всем, привет.

Собственно проблемы 2:

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

во-вторых, никак не могу разобраться с тем как управлять видимостью компонентов на странице. При открытии диалогового окна мне надо обображать в нем определенный набор кнопок(для добавления или для редактирования). Предполагал сделать так - если юзер в бине есть то редактирование, нет - добавление. Юзер сетается в бин через ajax при клике на строке таблицы. Свойство rendered насколько я
 понял в данном случае не подходит. Пока на ум приходит только управление видимостью div-ов содержащих эти кнопки через js, но мне кажется что должен быть более простой подход для  этих целей средствами самого фреймворке. 
Код

<ui:define name="body">    
    <h:form>
        <p:panel>
            <p:dataTable width="100%" id="userListTable" styleClass="yui-skin-sam" var="user" value="#{adminBean.users}" 
                         paginator="true" paginatorPosition="bottom"
                         rows="10" selectionMode="single"
                         selection="#{adminBean.processedUser}" dynamic="true" update="display"
                         onselectComplete="userDialog.show()">

                <p:column filterBy="#{user.login}" resizable="true">
                    <f:facet name="header">
                        <h:outputText value="#{i18n['pages.user_list.login']}" />
                    </f:facet>
                    <h:outputText value="#{user.login}" />
                </p:column>
                
                <p:column filterBy="#{user.lastName}" resizable="true">
                    <f:facet name="header">
                        <h:outputText value="#{i18n['pages.user_list.lastName']}" />
                    </f:facet>
                    <h:outputText value="#{user.lastName}" />
                </p:column>            
            </p:dataTable>
            <p:commandButton value="Add New User" onclick="userDialog.show()"/>
        </p:panel>    

            <p:dialog header="User Details" widgetVar="userDialog" modal="true"
                fixedCenter="true" draggable="false" width="300px" close="false">

                <h:panelGrid id="display" columns="2">
                    <h:outputText value="#{i18n['pages.user_list.login']}:" />
                    <h:inputText value="#{adminBean.processedUser.login}"
                        style="font-weight:bold" />

                    <h:outputText value="#{i18n['pages.user_list.lastName']}:" />
                    <h:inputText value="#{adminBean.processedUser.lastName}"
                        style="font-weight:bold" />                               
                </h:panelGrid>
                <div id="addUserButtonsBlock" align="right">
                        <p:commandButton type="image" action="#{adminBean.doAddUser}" image="/i/add.gif" update="userListTable, display" oncomplete="userDialog.hide()"/>&nbsp;&nbsp;
                        <p:commandButton type="image" action="#{adminBean.doCancelEditUser}" image="/i/cancel.png" update="userListTable, display" oncomplete="userDialog.hide()"/>
                </div>
                <div id="editUserButtonsBlock" align="right">
                        <p:commandButton type="image" action="#{adminBean.doUpdateUser}" image="/i/passed.gif" update="userListTable, display" oncomplete="userDialog.hide()"/>&nbsp;&nbsp;
                        <p:commandButton type="image" action="#{adminBean.doDeleteUser}" image="/i/delete.png" update="userListTable, display" oncomplete="userDialog.hide()"/>&nbsp;&nbsp; 
                        <p:commandButton type="image" action="#{adminBean.doCancelEditUser}" image="/i/cancel.png" update="userListTable, display" oncomplete="userDialog.hide()"/>
                </div>
            </p:dialog>
        </h:form>
    </ui:define>


Спасибо.

Автор: vogdb 28.5.2010, 16:13
Решил 2ой вопрос через rendered на jsf2. Все прекрасно работало. Имхо, проблему видимости через js решать несерьезно.

Автор: anti_snayper 2.6.2010, 15:18
По первому вопросу: заменил фильтрацию на сортировку по колонкам + paging. Фильтрация, конечно в primefaces вещь удобная, но не самая презентабельная...

Второй вопрос так и не решен. Да рендеринг позволяет управлять видимостью компонентов на странице, но actions повещенные на кнопки после этого не срабатывают, методы бина не вызываются. Причем без этого атрибута все работает на ура.

Пример кода.
Код

<h:panelGroup align="right" rendered="not empty buildingBean.currentBuilding.id">
             <h:commandButton type="image" action="#{buildingBean.doUpdateBuilding}"
                          image="/i/passed.gif" update="messages" />&nbsp;&nbsp;
              <h:commandButton type="image" action="#{buildingBean.doDeleteBuilding}"                                        
                          image="/i/delete.png" update="messages" />&nbsp;&nbsp;                                         
              <h:commandButton type="image" action="#{buildingBean.doCancelEditBuilding}"
                          image="/i/cancel.png" />
</h:panelGroup>                                    
<h:panelGroup align="right" rendered="empty buildingBean.currentBuilding.id">
              <h:commandButton type="image" action="#{buildingBean.doAddBuilding}"                                             
                          image="/i/add.gif" update="messages" />&nbsp;&nbsp;                  
              <h:commandButton type="image" action="#{buildingBean.doCancelEditBuilding}"
                          image="/i/cancel.png" />
</h:panelGroup>    


Насколько я понял, primefaces здесь не при чем. Это касяк самого jsf. Кто-нибудь знает как это обойти?

Автор: m0zg 3.6.2010, 12:34
спроси http://primefaces.prime.com.tr/forum/viewforum.php?f=3, отвечают достаточно оперативно. Недавно даже http://www.primefaces.org:8080/prime-showcase/ui/dataListHome.jsf новый написали по моей просьбе smile

Автор: anti_snayper 3.6.2010, 15:59
Честно говоря, мне все-таки кажется, что проблема в jsf. При клике на кнопке, нужный метод бина не вызывается, но страница перезагружается. Причем в ее бине сохраняются только те значения, под которые на странице были созданы компоненты(textInput, например). Остальные значения бина теряются.

Автор: m0zg 4.6.2010, 09:10
Я что-то вопрос не очень понимаю. У тебя не работают action'ы в диалоге? Т.е. методы, прописанные в них не вызываются?

Автор: anti_snayper 4.6.2010, 10:37
Именно так. Тем не менее, страница перезагружается и ее бин содержит неполные данные.

Автор: m0zg 4.6.2010, 11:23
У меня была такая проблема в RichFaces c компонентом modalPanel. Там не работают action'ы. Поменяй на actionListner, должно сработать.

Автор: anti_snayper 4.6.2010, 21:35
Не помогло. Тот же результат. 

Автор: anti_snayper 12.6.2010, 17:09
Проблему, по-нормальному, решить так и не удалось. В интернете нашел много постов на подобные темы. В качестве решений в них предлагались различные костыли: перевод бина из requestScope в SessionScope, использование jstl(if-конструкции) и т.д.. Вариант с сессией мне явно не подходил, с jstl тоже не пошло. В результате придумал свой.
Код

.hidden {
       display:none;
}


и на самой страничке:
Код

<h:panelGroup class="#{not empty buildingBean.currentBuilding.id ? '' : 'hidden'}">


Автор: anti_snayper 13.6.2010, 08:06
закрыта

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)