因此,经过几天的调试,我们最终能够重现复合组件之间的一些奇怪的交互ui:repeat,p:remoteCommand以及我们不理解的JSF中的部分状态保存.
复合组件使用迭代对象列表ui:repeat.在每次迭代期间,包含另一个复合组件并传递参数.
<ui:composition (...)>
<ui:repeat var="myVar" value="#{cc.attrs.controller.someList}">
<namespace:myRemoteCommand someParam="SomeParam"/>
Run Code Online (Sandbox Code Playgroud)
在包含的复合组件中,有一个自动运行p:remoteCommand调用方法,该方法使用组件接口中定义的参数.
<ui:component (...)>
<p:remoteCommand actionListener="#{someBean.someMethod(cc.attrs.someParam)}"
autoRun="true"
async="true"
global="false">
Run Code Online (Sandbox Code Playgroud)
但是,在设置断点时someMethod(...),会传递一个空字符串.仅当部分状态保存设置为false时才会发生这种情况.
我们尝试了几种解决方案,以下方案似乎有效(但我们不明白为什么,也无法预见可能发生的任何其他问题):
我们可以将部分状态保存设置为true.
我们可以将复合组件模式更改为ui:include.
我们可以删除一个或两个复合组件,而是直接包含内容.
题
为什么JSF会这样做?复合组件ui:repeat和参数传递之间的这种交互是什么,这取决于我们是否使用ui:include/部分状态保存?
我们使用的是Primefaces 5.3,Glassfish 4.1,Mojarra 2.2.12,Java 8.