这些<p:selectOneMenu>
组件实际上被滥用以拥有一个<div><ul><li>
带有最少代码的漂亮下拉菜单;)它们的值表示当前菜单组和页面,它们在设计上是只读的(它们没有 setter 方法)。window.location
导航由在更改事件期间处理的 JavaScript进行。他们不属于任何形式,也不参与任何形式的提交。
该disabled
属性理论上不是强制性的,但是当同步提交同一页面中其他地方的非 ajax JSF 表单时,即使它根本没有包含在任何表单中,PrimeFacesSelectOneMenuRenderer
仍会完整地尝试它。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)
当disabled
属性true
在回发期间进行评估时,SelectOneMenuRenderer
将跳过decode()
应用请求值期间的阶段,从而也跳过模型值的更新。但是,如果它true
在渲染响应阶段也进行了评估,那么它将变得不可选择(因此无法使用)。因此,它不应该在渲染响应阶段评估为真。表达方式
disabled="#{facesContext.postback and not facesContext.renderResponse}"
正是做到了这一点。总而言之,它基本上是一种解决奇怪行为的方法SelectOneMenuRenderer
(我还没有真正调查过根本原因)。
要自己测试,请拉取项目,删除disabled
属性并在例如<o:onloadScript>
展示页面中调用同步提交。