应该invokeOnComponent调用pushComponentToEL来处理复合组件

时间:2018-01-19 23:45:33

标签: jsf el composite-component mojarra

这是关于UIComponent.invokeOnComponent()方法的JSF规范当前预期行为的讨论。

摘要

我在使用带有2个不同支持组件的2个复合组件时遇到了意外行为,因为invokeOnComponent方法没有pushComponentToELImplicitELResolver依赖于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

场景

发生以下情况时会出现问题:

    在复合组件1 上调用
  1. encodeAll 在复合组件1
  2. 上调用
  3. encodeBegin 在复合组件1
  4. 上调用
  5. pushComponentToEL
  6. “CURRENT_COMPOSITE_COMPONENT_STACK”已更新
  7. 在myComponent上调用
  8. encodeAll
  9. “myComponent”渲染器需要找到一个组件,从而调用invokeOnComponent上的UIViewRoot
  10. invokeOnComponent的递归性到达复合组件2中invokeOnComponent组件的DataTable方法
  11. DataTable需要解析#{cc.myList}以继续使用每行数据访问树。
  12. ImplicitELResolver尝试解析#{cc.xxx}基础。这是使用UIComponent.getCurrentCompositeComponent()方法完成的,该方法依赖于“CURRENT_COMPOSITE_COMPONENT_STACK”并解析为BACKING_COMPONENT_1(而不是BACKING_COMPONENT_2)
  13. 问题

    在我看来,这是一些jsf规范问题,它确定invokeOnComponent方法应该在调用回调之前调用pushComponentToEL方法和popComponentToEL,如果clientId是搜索到的那个并且在invokeOnComponent上调用facetsAndChildren方法时,未指定这样做。

    解决方法

    作为一种解决方法,我重写了复合组件支持组件中的invokeOnComponent方法以推送和弹出组件。

    提出真正的问题。

    invokeOnComponent上调用facetsAndChildrens方法时,是否应该使用推送和弹出机制? 在其他情况下,这种解决方法是否会引起我一些看不见的问题?

0 个答案:

没有答案