如果未呈现表,reRender如何表现

时间:2012-03-01 13:30:30

标签: jsf richfaces jsf-1.2

我只是使用jsf + richfaces实现了一个粗略的功能,并遇到了这种情况,所以把它放到开放的论坛上寻找答案。

我在表单中有一个文本字段和rich:dataTable。当textField中的值发生更改时,将填充表数据,并且应该使用最新数据重新表示表。

现在问题的关键点:如果我在dataTable上呈现条件说如果值列表不是空/非空则渲染此表怎么办?因此,第一次出现屏幕时,list为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 个答案:

答案 0 :(得分:4)

我通过使用一些始终呈现的组件包围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>

答案 1 :(得分:0)

问题是你不能重新渲染第一次没有渲染的东西。我的解决方案是使用组件样式的display属性。

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

通过这种方式,我可以毫无问题地重新登记表格。)。