JSF:ui:包含和(损坏的)视图范围

时间:2012-09-13 18:52:50

标签: ajax jsf-2 mojarra view-scope uiinclude

我有一个包含一些常见元素的JSF页面,然后根据各种用户操作动态加载和包含4个部分。我有bean封装各种包含的功能,结构是这样的:

mainview.xhtml 
     --backed by--> mainViewBean (request scope) 
       --with managed property--> mainViewView (view scope)

include1.xhtml
     --backed by--> include1Bean (request scope)
       --with managed property--> mainViewBean

include2.xhtml
     --backed by--> include2Bean (request scope)
       --with managed property--> mainViewBean

include3.xhtml
     --backed by (and with component bindings to)--> include3Bean (request scope)
       --with managed property--> mainViewBean

include4.xhtml
     --backed by--> mainViewBean

在主视图页面上,每个包含都是通过BalusC在这些问题中描述的一系列有条件渲染的h:panelGroups包含的:

https://stackoverflow.com/a/9897016/945403

https://stackoverflow.com/a/7113961/945403

视图范围bean包含一些关于用户活动当前状态的各种视图信息,他们当前正在查看的项目等等。

每个包含的视图都通过ajax和非ajax帖子执行各种任务。我的问题是,某些小组中的某些行为似乎会导致视野范围被破坏,而且似乎没有任何押韵或理由。我提前为下面列出的错综复杂的工作流程道歉,但我会尽量清楚地表达。

如果我在include3.xhtml中执行ajax操作,它们只在include中呈现组件,我可以整天完成它们并且视图范围仍然存在。如果我执行非ajax帖子,刷新将更新(并可能添加以前未呈现的)include4.xhtml。然后,我可以随后在任何其他包含中执行操作。

如果我在include1.xhtml中执行ajax操作,该操作仅调用其自己的支持bean中的方法,并且仅更新其自己的组件,则视图范围仍然存在。如果我执行调用include3Bean中的方法的ajax操作并更新包含include2.xhtml和include3.xhtml的div,则视图范围仍然存在,只要我继续在include1.xhtml中执行操作,视图范围将保留。一旦我尝试在其中一个包含中执行另一个操作,视图范围就会被销毁。

至于这一点,我认为问题必定在于我正在更新不同的包含而不是从中调用动作。但这似乎不是问题(或至少是唯一的问题),正如我现在要解释的那样。

include2.xhtml有一个ajax动作,当被触发时,调用mainViewBacking中的方法并更新包含include2.xhtml和include3.xhtml的div。如果我继续执行此操作,或者在include2.xhtml中执行任何其他操作(包括非Ajax操作),一切都按预期工作,视图范围仍然存在。但是,如果我随后在include3.xhtml中执行操作,则视图范围将被销毁。这很奇怪的是我可以在include1.xhtml中执行操作,并且只要我愿意,他们将继续访问视图范围,但如果我尝试返回并执行操作在include2.xhtml或include3.xhtml中,视图范围再次丢失。

我现在有点陷入困境,我甚至不确定如何弄清楚出了什么问题。我假设要刷新(并删除或添加)包含导致视图范围丢失,但从以前链接的问题看来,这似乎不应该是一个问题,因为ui的实际src值:包含不是动态生成的。我确实关闭了mainview.xhtml的部分状态保存。

是否存在关于动态显示ui的内容:包含打破视图范围的内容?

0 个答案:

没有答案