我在一个小型web应用程序中使用JSF 2.3和Bootsfaces 3.3。我偶然发现了一个场景,Bootsfaces的<b: commandButton ajax=true>当<h: 命令按钮><f: ajax>没有。查看引发Bootsfaces的异常,无法找到应在渲染响应阶段更新的具有给定ID的元素(以下示例中为"ajaxUpdateMe"(。
我浏览了xhtml页面,确定了实际问题所在,对我来说,它看起来像<ui:重复>以及ajaxafied<b: 命令按钮>合作不顺利。这是我正在使用的xhtml页面(减去<html>和<head>部分(:
<h:body>
<b:form id="formTable">
<!-- iterate over list of objects -->
<ui:repeat value="#{testBean.list}" var="element">
<b:row>
<b:column><h:outputText id="ajaxUpdateMe" value="#{element.name}" /></b:column>
</b:row>
<b:row>
<b:column>
<!-- iterate over another list -->
<h:dataTable value="#{element.innerList}" var="inner">
<h:column>
<b:commandButton ajax="true" value="submit"
action="#{testBean.submit(element)}"
update=":#{component.namingContainer.parent.namingContainer.clientId}:ajaxUpdateMe"
process="@this" />
</h:column>
</h:dataTable>
</b:column>
</b:row>
</ui:repeat>
</b:form>
</h:body>
当我试图通过浏览器访问xhtml页面(GET请求(时,会立即引发一个异常,看起来像这样(为了简洁起见,缩短了(:
Caused by: javax.faces.FacesException: Invalid search expression: formTable:j_idt4:0:ajaxUpdateMe The subexpression 0 doesn't exist, or it can't be resolved. net.bootsfaces.component.commandButton.CommandButton formTable:j_idt4:0:j_idt9:0:j_idt13 Additional information: ID not found: 0 search expression: formTable:j_idt4:0:ajaxUpdateMe
at net.bootsfaces.expressions.ExpressionResolver.translateSearchExpressionToId(ExpressionResolver.java:143)
at net.bootsfaces.expressions.ExpressionResolver.getComponentId(ExpressionResolver.java:89)
at net.bootsfaces.expressions.ExpressionResolver.getComponentIDs(ExpressionResolver.java:50)
at net.bootsfaces.expressions.ExpressionResolver.getComponentIDs(ExpressionResolver.java:44)
at net.bootsfaces.component.ajax.AJAXRenderer.generateAJAXCallForClientBehavior(AJAXRenderer.java:582)
at net.bootsfaces.component.ajax.AJAXRenderer.generateBootsFacesAJAXAndJavaScript(AJAXRenderer.java:233)
at net.bootsfaces.component.ajax.AJAXRenderer.generateBootsFacesAJAXAndJavaScript(AJAXRenderer.java:177)
at net.bootsfaces.component.commandButton.CommandButtonRenderer.encodeBegin(CommandButtonRenderer.java:120)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:892)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:307)
at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:114)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:918)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:309)
at com.sun.faces.renderkit.html_basic.TableRenderer.renderRow(TableRenderer.java:398)
at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:161)
我在这里用以下代码替换了Bootsfaces中的命令按钮:
<h:commandButton value="submit"
action="#{testBean.submit(element)}">
<f:ajax render=":#{component.namingContainer.parent.namingContainer.clientId}:ajaxUpdateMe"
execute="@this"/>
</h:commandButton>
现在页面加载良好,命令按钮执行它应该执行的操作。在浏览器中检查html页面的来源时,我可以看到异常消息formTable:j_idt4:0:ajaxUpdateMe
中提到的元素实际上就在那里。
我是在Bootsfaces中遇到错误还是做错了什么?有人知道我仍然可以使用Bootsfaces中的命令按钮的解决方法吗?
看起来BootsFaces ID解析器与formTable:j_idt4:0:ajaxUpdateMe
中的0
发生冲突。您可以尝试在ui中添加一个id="elements
:repeat,然后通过:formTable:elements:ajaxUpdateMe
直接引用目标组件。
<h:body>
<b:form id="formTable">
<!-- iterate over list of objects -->
<ui:repeat id="elements" value="#{testBean.list}" var="element">
<b:row>
<b:column><h:outputText id="ajaxUpdateMe" value="#{element.name}" /></b:column>
</b:row>
<b:row>
<b:column>
<!-- iterate over another list -->
<h:dataTable value="#{element.innerList}" var="inner">
<h:column>
<b:commandButton ajax="true" value="submit"
action="#{testBean.submit(element)}"
update=":#formTable:elements:ajaxUpdateMe"
process="@this" />
</h:column>
</h:dataTable>
</b:column>
</b:row>
</ui:repeat>
</b:form>
</h:body>
我的IDE并不建议ui:repeat
实际上有id
属性,但它在某种程度上对我有效
或者,您可以在按钮上添加一个标准f:ajax
:
<b:commandButton ajax="true" value="submit" process="@this">
<f:ajax render=":#{component.namingContainer.parent.namingContainer.clientId}:ajaxUpdateMe" />
</b:commandButton>
我不确定这是否被认为是一个bug。你可能想在他们的问题跟踪中提到这一点