Как ведет себя reRender, если таблица не отображается - PullRequest
2 голосов
/ 01 марта 2012

Я только что реализовал грубую функциональность, используя jsf + richfaces, и натолкнулся на эту ситуацию, поэтому выкладывал это на открытый форум для получения ответов.

У меня есть текстовое поле и rich: dataTable внутри формы.Когда значение изменяется в textField, данные таблицы заполняются, и предполагается, что таблица будет перерисована с последними данными.

Теперь вопрос: что, если я предоставил условие для dataTable, изобразив эту таблицу, если список значенийне-нуль / не пуст?Таким образом, в первый раз, когда появляется экран, список имеет значение null / empty и, следовательно, таблица не отображается, как и когда я изменяю textField, значения заполняются, и вызывается reRender для таблицы, но в целом таблица не существует.

Есть ли способ решить это поведение?Если я перезагружу страницу, то да, безусловно, появится таблица:)

Вот пример кода для этого:

    <h:form id="userSearchForm" prependId="false">
        <h:inputText value="#{ldapSearch.searchString}">
            <a4j:support event="onkeyup" ignoreDupResponses="true" ajaxSingle="true" reRender="usersTable"
            requestDelay="50" actionListener="#{ldapSearch.searchUser}"/>
        </h:inputText>
            <rich:dataTable id="usersTable"
                rendered="#{not empty ldapSearch.users}"
                value="#{ldapSearch.users}" var="user">
                <rich:column sortable="false" label="Name">
                    <f:facet name="header">
                        <h:outputText value="Name"/>
                    </f:facet>
                    <h:outputText title="#{user.displayName}" value="#{user.displayName}"/>
                </rich:column>
            </rich:dataTable>
    </h:form>

Ответы [ 2 ]

4 голосов
/ 01 марта 2012

Я решаю эту проблему, окружая dataTable каким-либо компонентом, который всегда отображается, а затем перерисовываю этот компонент. Например:

<h:form id="userSearchForm" prependId="false">
    <h:inputText value="#{ldapSearch.searchString}">
        <a4j:support event="onkeyup" ignoreDupResponses="true" ajaxSingle="true" reRender="divUsersTable"
        requestDelay="50" actionListener="#{ldapSearch.searchUser}"/>
    </h:inputText>
    <s:div id="divUsersTable">
        <rich:dataTable id="usersTable"
            rendered="#{not empty ldapSearch.users}"
            value="#{ldapSearch.users}" var="user">
            <rich:column sortable="false" label="Name">
                <f:facet name="header">
                    <h:outputText value="Name"/>
                </f:facet>
                <h:outputText title="#{user.displayName}" value="#{user.displayName}"/>
            </rich:column>
        </rich:dataTable>
    </s:div>
</h:form>
0 голосов
/ 01 марта 2012

Проблема в том, что вы не можете перерисовать то, что не было визуализировано в первый раз. Мое решение - поиграть с атрибутом display стиля компонента.

<rich:dataTable id="usersTable"
    style="display:#{not empty ldapSearch.users? 'inline' : 'none'}"    
    value="#{ldapSearch.users}" var="user">
<!-- your columns -->
</rich:dataTable>

Таким образом, я могу без проблем перерисовать таблицу:).

...