我发现了一个关于 JSF 的 ajax 渲染的奇怪行为,我不确定我缺少什么。为简单起见,我有一个带有h:inputText
and 和 a的页面,h:panelGrid
里面有一个按钮。当有人单击按钮时,h:inputText
应该将 的值设置为标准值并且h:panelGrid
应该消失。首先,我将展示代码,然后再解释一下。
xhtml页面:
<h:inputText id="trackingIdValue" value="#{bean.trackingId}" />
<h:panelGrid border="15" id="panel" rendered="#{not empty bean.list}">
<h:commandButton action="#{bean.render}" value="Clear Panel" >
<f:ajax execute="@this" render="panel trackingIdValue" />
</h:commandButton>
</h:panelGrid>
对应的bean:
private Long trackingId;
private List<String> list;
public Long getTrackingId() {
return trackingId;
}
public List<String> getList() {
return list;
}
public void setList( List<String> list ) {
this.list = list;
}
@PostConstruct
public void init() {
// the list will be filled with some initial values
}
public void render() {
this.trackingId = 954643L;
list.clear();
}
当页面被加载时,列表将填充PostConstruct
. 这导致面板的显示,因为列表现在不是空的。但是,当我单击面板中的按钮(更改 trackingId 并清空列表)时,GUI 中的 trackingId 发生了更改,但面板仍然可见。我做错了什么?
更新 1
正如评论中所写,我在一个空项目中尝试了上面的代码,它在那里工作。我目前有一个巨大的应用程序,因此缩小了我的页面并结束了以下内容:
我的项目由多个页面模板组成。在我的主布局中,我有一个h:head
标签,它加载了应用程序所需的许多样式表。当我完全删除h:head
标签时,它就可以工作了,但是我的造型当然很糟糕。这与我的 ajax 加载和面板网格有什么关系?
更新 2
我已将我的应用程序缩短到只有一个小页面:
<h:head>
<h:outputStylesheet name="masterStyle.css" library="css" />
</h:head>
<h:body>
<h:form>
<h:inputText id="trackingIdValue" value="#{testBean.trackingId}" />
<h:panelGroup border="15" id="panel"
rendered="#{not empty testBean.list}">
<h:commandButton action="#{testBean.render}" value="Clear Panel">
<f:ajax execute="@this" render="panel trackingIdValue" />
</h:commandButton>
</h:panelGroup>
</h:form>
</h:body>
</html>
当我删除标题标签时,ajax 请求在 inputtext 和面板上都可以正常工作。但是当我在上面的标题中添加我的样式表时,ajax 仅适用于输入文本。