我只是使用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>
答案 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>
通过这种方式,我可以毫无问题地重新登记表格。)。