【发布时间】:2016-06-29 14:18:23
【问题描述】:
所以经过几天的调试,我们最终能够重现复合组件之间的一些奇怪交互,ui:repeat、p:remoteCommand 以及我们不理解的 JSF 中的部分状态保存。
场景
复合组件使用ui:repeat 遍历对象列表。在每次迭代期间,都会包含另一个复合组件并传递参数。
<ui:composition (...)>
<ui:repeat var="myVar" value="#{cc.attrs.controller.someList}">
<namespace:myRemoteCommand someParam="SomeParam"/>
在包含的复合组件中,有一个自动运行的p:remoteCommand 使用组件接口中定义的参数调用方法。
<ui:component (...)>
<p:remoteCommand actionListener="#{someBean.someMethod(cc.attrs.someParam)}"
autoRun="true"
async="true"
global="false">
但是,在someMethod(...) 中设置断点时,会传递一个空字符串。仅当 部分状态保存 设置为 false 时才会发生这种情况。
解决方案
我们尝试了几种解决方案,以下解决方案似乎有效(但我们不明白原因,也无法预见可能发生的任何进一步问题):
我们可以将部分状态保存设置为
true。我们可以将复合组件模式改为
ui:include。我们可以删除一个或两个复合组件,并直接包含内容。
问题
为什么 JSF 会这样?复合组件ui:repeat 和参数传递之间的这种交互是什么?根据我们是否使用ui:include / 部分状态保存而改变?
我们正在使用 Primefaces 5.3、Glassfish 4.1、Mojarra 2.2.12、Java 8。
【问题讨论】:
标签: jsf primefaces composite-component mojarra uirepeat