JSF标记处理程序限制?

时间:2016-10-24 13:47:04

标签: jsf-2.2

我认为标记处理程序的使用存在限制:标记处理程序无法安全地添加到c:forEach标记。

我可以理解这种类型的构造可能看起来很奇怪,但我遇到的情况是,对组件进行的自定义更改的数量必须是动态的,如下例所示:

<my:component ...>
    <c:forEach items=#{bean.items} var="item">
        <my:tag ... />
    </c:forEach>
</my:component>

如果项目数发生变化,此构造在回发中不起作用。

  • 在还原视图阶段,项目数等于上一个响应中呈现的项目数。在此阶段,标记处理程序的父组件是新的。
  • 在渲染响应阶段,如果例如自上次渲染响应阶段以来bean模型已更新,则项目数可能已更改。在此阶段,在回发时,标记处理程序的父组件不是新的。
  • 由于我们不想将相同的更改两次应用于父组件(还原视图和渲染响应),我们首先检查标记处理程序的父组件是否是新的,然后我们应用标记if并且只有它是新的。
  • 但是在这种情况下,在回发期间,应用于父组件的更改不是更新后bean指定的更改,因为在呈现响应阶段,父组件不再是新组件。

我不确定此用例是否有简单的解决方案,在这种情况下我应该使用组件而不是标签吗?

注:

  • 在还原视图阶段,标记处理程序将更改应用于其父组件。
  • 然后恢复父组件的状态。
  • 如果应用于父组件的更改保存在组件的状态持有者中,则在应用标记处理程序后将恢复这些更改。
  • 因此,在还原视图阶段,这些更改首先由标记处理程序应用,然后由已保存的更改替换。看起来多余,没有?

可能的解决方法?

我尝试了一种解决方法,似乎适用于应用于父组件的更改仅涉及呈现方式的情况:

  1. 仅在呈现响应阶段将标记应用于父组件,无论父组件是否为新组件。
  2. 请勿将标记应用的更改保存到父级的组件状态持有者中。
  3. 当然,如果必须在还原视图阶段和渲染响应阶段之间使用应用的更改,则此方法不起作用。

0 个答案:

没有答案