我认为标记处理程序的使用存在限制:标记处理程序无法安全地添加到c:forEach
标记。
我可以理解这种类型的构造可能看起来很奇怪,但我遇到的情况是,对组件进行的自定义更改的数量必须是动态的,如下例所示:
<my:component ...>
<c:forEach items=#{bean.items} var="item">
<my:tag ... />
</c:forEach>
</my:component>
如果项目数发生变化,此构造在回发中不起作用。
- 在还原视图阶段,项目数等于上一个响应中呈现的项目数。在此阶段,标记处理程序的父组件是新的。
- 在渲染响应阶段,如果例如自上次渲染响应阶段以来bean模型已更新,则项目数可能已更改。在此阶段,在回发时,标记处理程序的父组件不是新的。
- 由于我们不想将相同的更改两次应用于父组件(还原视图和渲染响应),我们首先检查标记处理程序的父组件是否是新的,然后我们应用标记if并且只有它是新的。
- 但是在这种情况下,在回发期间,应用于父组件的更改不是更新后bean指定的更改,因为在呈现响应阶段,父组件不再是新组件。
我不确定此用例是否有简单的解决方案,在这种情况下我应该使用组件而不是标签吗?
注:
- 在还原视图阶段,标记处理程序将更改应用于其父组件。
- 然后恢复父组件的状态。
- 如果应用于父组件的更改保存在组件的状态持有者中,则在应用标记处理程序后将恢复这些更改。
- 因此,在还原视图阶段,这些更改首先由标记处理程序应用,然后由已保存的更改替换。看起来多余,没有?
可能的解决方法?
我尝试了一种解决方法,似乎适用于应用于父组件的更改仅涉及呈现方式的情况:
- 仅在呈现响应阶段将标记应用于父组件,无论父组件是否为新组件。
- 请勿将标记应用的更改保存到父级的组件状态持有者中。
醇>
当然,如果必须在还原视图阶段和渲染响应阶段之间使用应用的更改,则此方法不起作用。