我有一个p:dataGrid,用于在3.0.1中更新自己。现在我升级到PF 3.1并且“availableIcons”组件的ajax更新事件不再触发。我没有收到在视图中找不到该组件的错误。
XHMTL
<h:form id="Application">
......
<p:confirmDialog id="iconDialog" message="Select one icon"
showEffect="bounce" hideEffect="explode" header="Icon Selection"
severity="alert" widgetVar="iconSelect" modal="false">
<p:dataGrid id="availableIcons" var="icon"
value="#{appEditController.availableIcons}" columns="4">
<p:column>
<p:panel id="pnl" header="" style="text-align:center">
<h:panelGrid columns="1" style="width:100%" id="iconPanelGrid">
<p:graphicImage value="/resources/icons/#{icon.icon}"
id="iconImage" />
<p:selectBooleanCheckbox id="iconSelector"
value="#{icon.selected}"
disabled="#{appEditController.isIconSelected(icon)}">
<p:ajax update="availableIcons" event="change"
process="availableIcons"
listener="#{appEditController.iconSelectedChanged(icon)}" />
</p:selectBooleanCheckbox>
</h:panelGrid>
</p:panel>
</p:column>
</p:dataGrid>
<p:commandButton value="Done" update="currentIcon"
action="#{appEditController.updateCurrentIcon}" ajax="false"
oncomplete="iconSelect.hide()" />
</p:confirmDialog>
.......
</h:form>
我没有看到缺少什么或什么不正确。
这是支持bean代码
public void updateCurrentIcon() {
for (IconVO iconVO : availableIcons) {
if (iconVO.isSelected()) {
log.debug("CURRENT ICON IS NOW " + iconVO.getIcon());
currentIcon = iconVO;
break;
}
}
}
public void iconSelectedChanged(IconVO iconVO) {
if (iconVO == currentIcon) {
log.debug("NULLING ICON");
currentIcon = null;
} else {
log.debug("SETTING NEW ICON");
currentIcon = iconVO;
}
}
public boolean isIconSelected(IconVO iconVO) {
log.debug("IS ICON SELECTED " + iconVO.getIcon());
if (currentIcon == null
|| iconVO.getIcon().equals(currentIcon.getIcon())) {
return false;
}
return currentIcon != null;
}
我尝试更新=“@ form”,然后更新了,但它完全关闭了模态面板。
谢谢, 科恩
答案 0 :(得分:1)
事实上,PrimeFaces通过相对客户端ID定位组件的方式changed in PrimeFaces 3.1已UIComponent#findComponent()
javadoc。
在您的特定情况下,您需要指定<p:dataGrid>
的绝对客户端ID。最简单的方法是检查生成的HTML源代码中<p:dataGrid>
的ID。到目前为止给出的代码是Application:availableIcons
。您需要在其前面添加:
以使其成为绝对值,然后在update
中引用它,如下所示:
<p:ajax update=":Application:availableIcons" ... />
更新根据评论结果根本不起作用。您可以尝试将表包装在一些不可见的包含组件(如<h:panelGroup>
)中,然后更新它。或者,您可以考虑将<h:form>
移到对话框中,然后使用update="@form"
。无论如何,在对话框之外设置<h:form>
有点奇怪。您肯定不会在同一表单中提交对话框外的所有其他输入。