2013-04-05 26 views
0

我有一个带有UI的XHTML:组合标记,我正在AJAX上加载它。我正在使用jQuery Ajax GET来加载此XHTML的URL。在加载的页面中,我有一个EL表达式,之后我还包含另外一个有更多EL表达式的源代码。不可避免地,包含来源的EL表达式正在被评估的时间早于出现在它之前的EL表达式。JSF页面中的EL评估不是连续的

Some.xhtml

<ui:composition ... 
    #{relationshipAction.followMember(param['relateToProfile'])} 
    <ui:include src="someOther.xhtml"> 
     <ui:param name="profileUri" value="#{param['relateToProfile']}" /> 
     <ui:param name="qualifier" value="#{param['qualifier']}" /> 
     <ui:param name="cellStyleClass" value="#{param['cellStyle']}" /> 
    </ui:include> 

在这里,我希望#{relationshipAction.followMember(param['relateToProfile'])}任何EL在包括someOther.xhtml之前进行评估。但它总是在一些Other.xhtml中的EL被首先评估。

任何想法可能会出错?你需要知道

回答

0

其中很重要的一点是,

<ui:include> is evaluated during view build time, not during view render time 

因此,<ui:include>评价以前您的视图,其中包含#{relationshipAction.followMember(param['relateToProfile'])},被渲染。

1

该规范没有说EL表达式是按照文本顺序进行评估的。一个组件可以随意在它选择的JSF生命周期的任何阶段评估EL表达式。只有在特定情况下才能对其进行评估,甚至可以多次评估。

除了规范实际定义它的罕见情况外,您不应该假定任何特定顺序。在你的情况下,JSF 2.2的viewAction组件或preRenderView事件可能更适合。 BalusC explains他们的使用相当易读,我想。

1

You should stop doing business logic in getter methods

改为使用bean的(后)构造函数或(动作)侦听器方法。 Bean属性必须返回已经准备好的值。我昨天回答了一个问题,即OP做出了同样的概念性错误。您也可能会发现它也很有用:Bean methods execution precedence in JSF

+0

一个跟随另一个用户的动作使得一个纯粹的jQuery-ajax GET加载一个XHTML将有更新信息(关于用户被跟踪)。在获取更新信息之前,我们调用一个方法来完成操作(follow-user)。我们把方法调用返回void到更新后的信息EL表达式之前的加载页面。请求范围中的bean完成操作并获取更新的信息。我不希望这个bean在它的'postconstruct'中做后续操作,因为在其他一些请求中可以引用它作为另一个目的。我应该在这种情况下理想地做些什么? – 2013-04-06 09:03:17

+0

然后使用''监听器。或者将bean的子类转换为另一个唯一用于此目的的bean,并在其中放置'@ PostConstruct' .. – BalusC 2013-04-06 12:11:44

+0

再次感谢!我也想过'f:event',但是'preRenderEvent'显然不是一个选项,因为那个时候EL表达式已经被评估过了。是否有一个事件可以与'ViewRoot'相关联,以适应这种情况? – 2013-04-06 15:41:55