我使用Myfaces 2.1.12和Richfaces 4.3.3创建了一个JSF应用程序。在普通浏览器上,应用程序运行正常,但客户端坚持认为他还需要使用“浏览器” - IE8,版本8.0.7601。我遇到了很多问题。
我在主窗体上有一个rich:extendedDataTable。单击一行是打开一个包含详细信息的弹出窗口(显示并填充所选行的数据)。也可以从工具栏调用弹出窗口,这样它会显示首次加载页面时选择的行的详细信息。
该表定义如下(为清晰起见,删除了列定义)
<h:form>
<rich:extendedDataTable id="table" rowClass="row" rows="15"
value="#{scheduleController.allSchedules}" var="schedule" selectionMode="single"
selection="#{scheduleListBean.selectedSchedule.selection}" clientRows="15">
<a4j:ajax render="scheduleDetails, toolbar, transferListPopup" event="selectionchange"
listener="#{scheduleController.scheduleSelectionChanged}"
oncomplete="#{rich:component('scheduleDetailsPopup')}.show()"/>
...
</rich:extendedDataTable>
</h:form>
弹出窗口包含几个面板网格,其中一个包含一些按钮。
<h:panelGrid columns="2" styleClass="alignTop" id="scheduleDetails">
...
<rich:panel header="#{generalProperties.controls}">
<h:panelGrid columns="4">
<a4j:commandLink styleClass="btn" type="button"
render="table@body, transferDetailsPanel, destinationPanel, datesPanel"
oncomplete="if (#{facesContext.maximumSeverity == null}) #{rich:component('scheduleDetailsPopup')}.hide()"
status="pleaseWait" action="#{scheduleController.saveSchedule}"
value="#{generalProperties.save}" />
<h:commandButton class="btn" action="#{scheduleController.changeScheduleStatus}"
value="#{applicationProperties.changeStatus}" status="pleaseWait" type="button"
disabled="#{scheduleController.currentSchedule.id == null}">
<rich:componentControl target="changeScheduleStatusPopup" operation="show" />
</h:commandButton>
<h:commandButton class="btn" value="#{generalProperties.delete}" status="pleaseWait" type="button"
disabled="#{scheduleController.currentSchedule.id == null}">
<rich:componentControl target="removeSchedulePopup" operation="show" />
</h:commandButton>
<a4j:commandButton styleClass="btn" type="button"
render="fileTable, transferDetailsPanel, destinationPanel, datesPanel"
disabled="#{scheduleController.currentSchedule.id == null}"
oncomplete="if (#{facesContext.maximumSeverity == null}) #{rich:component('transferListPopup')}.show()"
status="pleaseWait" value="#{applicationProperties.transferHistory}" />
</h:panelGrid>
</rich:panel>
</h:panelGrid>
disabled =“#{scheduleController.currentSchedule.id == null}”部分检查bean是否选择了任何内容,因为弹出窗口也用于添加新行。
在Firefox上一切正常。在IE8上:
我错过了什么?
答案 0 :(得分:0)
答案就是问题本身。我重建了UI,以便在ajax请求中不呈现任何按钮。这种方式适用于IE 8和IE 9。
即:不是基于bean设置disabled属性并渲染按钮,而是必须使用每个按钮的两个实例。我通过使用composite将表单提取到复合组件中来实现这一点:insertChildren只是为了在正确的状态下注入按钮并在页面上有两个表单实例,当用户单击新的计划/编辑计划时显示正确的实例。
这种方法的缺点是我必须将显示弹出窗口的组件的render属性设置为不同的形式(在本例中为面板),如果我使用Mojarra则会出现问题(请参阅此问题) :javax.faces.ViewState is missing after ajax render)