条件#{facesContext.postback而不是facesContext.renderResponse}是什么意思?

Eli*_*les 5 el jsf-2

当我遇到以下条件时,我正在OmniFaces Showcase应用程序中检出此模板的代码:p:selectOneMenu

disabled="#{facesContext.postback and not facesContext.renderResponse}"
Run Code Online (Sandbox Code Playgroud)

通过使用该应用程序,似乎从未禁用过selectOneMenu,那么这段代码实际上是做什么的?

我知道,facesContext.postbacktrue每当该页面是从POST请求的结果JSF组件(产生的commandButton / commandLink等),但什么是通常的预期状态facesContext.renderResponse时,在查看评估?

更新:哎呀,刚才我看到了一条评论:除了渲染响应外,它们在其他阶段被禁用,因为他们抱怨即使没有表单也无法设置模型值

因此,我猜想在Faces生命周期中会多次评估条件,并且禁用组件直到达到最后一个状态(renderResponse)为止,当facesContext.renderResponse评估为时true,整个表达式的评估结果为false,然后启用了组件。那是对的吗?

Bal*_*usC 5

这些<p:selectOneMenu>组件实际上是滥用了一个<div><ul><li>带有最少代码的漂亮下拉菜单;)它们的值表示当前菜单组和页面,这些菜单组和页面在设计上是只读的(它们没有setter方法)。导航通过JavaScript进行window.location在更改事件期间处理进行。它们不属于任何形式,也不参与任何形式的提交。

disabled理论上讲,该属性不是强制性的,但是当同步提交同一页面中其他位置的非ajax JSF表单时,即使根本没有将它封装成任何形式,PrimeFaces SelectOneMenuRenderer仍将尝试decode()全部尝试该属性。当要更新模型值时,最终将导致以下异常,因为该值没有设置器:

javax.el.PropertyNotWritableException: /WEB-INF/templates/showcase.xhtml @28,80 value="#{parent.children[0].viewId}": The class 'org.omnifaces.showcase.Page' does not have a writable property 'viewId'.
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136)
    at javax.faces.component.UIInput.updateModel(UIInput.java:818)
    at javax.faces.component.UIInput.processUpdates(UIInput.java:735)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
    at org.primefaces.component.panel.Panel.processUpdates(Panel.java:304)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
    at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)
    at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1231)
    at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
Run Code Online (Sandbox Code Playgroud)

disabled属性trueSelectOneMenuRendererdecode()期间求值时,则将跳过“ 应用请求期间”阶段,因此也跳过模型值的更新。但是,如果它true渲染响应阶段也进行了评估,则它将变为不可选择(因此不可使用)。因此,它不应在渲染响应阶段评估为true。表达方式

disabled="#{facesContext.postback and not facesContext.renderResponse}"
Run Code Online (Sandbox Code Playgroud)

做到这一点。总而言之,这基本上是一种针对SelectOneMenuRenderer(我尚未真正调查其根本原因的)。

要自己进行测试,请拉出项目,删除disabled属性,然后在例如<o:onloadScript>展示页面中调用同步提交。