这是关于UIComponent.invokeOnComponent()
方法的JSF规范当前预期行为的讨论。
我在使用带有2个不同支持组件的2个复合组件时遇到了意外行为,因为invokeOnComponent
方法没有pushComponentToEL
而ImplicitELResolver
依赖于getCurrentCompositeComponent
来获取#{cc.xx}属性的值。
那么,invokeOnComponent
是否应该在迭代子节点之前调用pushComponentToEL
(就像在调用回调之前一样)。
这是我在我的支持bean的覆盖invokeOnComponent
方法中实现的解决方法,但我不太确定后果。
以下是我遇到的一些简化代码段的用例,专注于
背后的问题考虑一个简单的面孔:
<html>
<compositeComponent:comp1>
<compositeComponent:comp2>
</html>
第一个自定义复合组件(comp1)的简化代码:
<composite:interface componentType="comp1">
</composite:interface>
<composite:implementation>
<myComponentLib:myComponent />
</composite:implementation>
这个由bean支持,我们将调用BACKING_COMPONENT_1
第一个自定义复合组件(comp2)的简化代码:
<composite:interface componentType="comp2">
</composite:interface>
<composite:implementation>
<p:dataTable value="#{cc.myList}" >
</p:dataTable>
</composite:implementation>
这个由bean支持,我们将调用BACKING_COMPONENT_2
发生以下情况时会出现问题:
encodeAll
在复合组件1 encodeBegin
在复合组件1 pushComponentToEL
encodeAll
invokeOnComponent
上的UIViewRoot
invokeOnComponent
的递归性到达复合组件2中invokeOnComponent
组件的DataTable
方法DataTable
需要解析#{cc.myList}
以继续使用每行数据访问树。ImplicitELResolver
尝试解析#{cc.xxx}
基础。这是使用UIComponent.getCurrentCompositeComponent()
方法完成的,该方法依赖于“CURRENT_COMPOSITE_COMPONENT_STACK”并解析为BACKING_COMPONENT_1(而不是BACKING_COMPONENT_2)在我看来,这是一些jsf规范问题,它确定invokeOnComponent
方法应该在调用回调之前调用pushComponentToEL
方法和popComponentToEL
,如果clientId是搜索到的那个并且在invokeOnComponent
上调用facetsAndChildren
方法时,未指定这样做。
作为一种解决方法,我重写了复合组件支持组件中的invokeOnComponent
方法以推送和弹出组件。
在invokeOnComponent
上调用facetsAndChildrens
方法时,是否应该使用推送和弹出机制?
在其他情况下,这种解决方法是否会引起我一些看不见的问题?