我正在开发一个Java EE应用程序(JSF2 + richfaces 3.3.3 + facelets)。
我想在加载页面时禁用我的h:selectOneMenu,当它完成加载时(使用函数onload()),我想重新启用我的组件。 我有这样的事情:
<ui:define name="infosHead">
<script type="text/javascript">
window.onload = function() {
document.getElementById("forme1_myform:valueCh").disabled = false;
alert("here");
}
</script>
</ui:define>
<ui:define name="infosBody">
<h:form id="forme1_myform" target="_blank">
<h:selectOneMenu id="valueCh" value="#{mybean.value}" disabled="true" >
<f:selectItems value="#{mybean.values}" />
<a4j:support event="onchange"
ajaxSingle="true"
limitToList="true"
reRender="id1,id2,...."
ignoreDupResponses="true"
action="#{mybean.actionme}"
oncomplete="getId();"/>
</h:selectOneMenu>
</h:form>
</ui:define>
这很好用。 但我的bean什么都没有(mybean.value == null)。
就像他认为该组件仍然被禁用。
我该如何使其有效?
答案 0 :(得分:4)
问题是您只在客户端启用组件。在服务器端,它始终为disabled="true"
。为了完成这项工作,您必须:
一个。将组件的disabled属性分配给最初为“true”的托管bean属性
disabled="#{myController.valueChDisableStatus}"
湾在你的h:form insert window.onload = callScript
里面℃。最后,在myController#someAction
方法中将valueChDisableStatus
属性设置为false
我现在无法检查解决方案,但我相信它会正常工作。
答案 1 :(得分:0)
我找到了这个解决方案。
<ui:define name="infosHead">
<script type="text/javascript">
window.onload = function() {
updateName(false); // sets 'disabled' from true to false
}
</script>
</ui:define>
<ui:define name="infosBody">
<h:form id="forme1_myform" target="_blank">
<h:selectOneMenu id="valueCh" value="#{mybean.value}" disabled="#{mybean.render}" >
<f:selectItems value="#{mybean.values}" />
<a4j:support event="onchange"
ajaxSingle="true"
limitToList="true"
reRender="id1,id2,...."
ignoreDupResponses="true"
action="#{mybean.actionme}"
oncomplete="getId();"/>
</h:selectOneMenu>
</h:form>
<a4j:form>
<!-- this is where it's going to reRender my component -->
<a4j:jsFunction name="updateName" reRender="valueCh">
<a4j:actionparam name="param1" assignTo="#{mybean.render}" />
</a4j:jsFunction>
</a4j:form>
</ui:define>
这是mybean的内容:
public class MyBean implements Serializable {
private List<SelectItem> values;
private String value;
private Boolean render = true; // the page loads with element disabled
public void actionme(){...}
//getters & setters
}
答案 2 :(得分:0)
这些解决方案都不适合我。
虽然从托管bean值设置元素的disabled属性工作正常,并且通过javascript更改它的值也工作正常,一旦提交表单,仍然没有达到“someaction”方法以“将valueChDisableStatus属性设置为假”。另外我发现即使我的托管bean有一个isDisabled()和一个setDisabled(布尔值),但是在提交表单(当然)之后从未调用过setDisabled()方法,尽管isDisabled()是。所以我无法找到使用这些解决方案将托管bean“disabledElement”值更改为false的方法。
我确实在这个链接上找到了一个对我有用的解决方案: http://blog.michaelscepaniak.com/jsf-you-cant-submit-a-disabled-form-element
基本上它表明默认情况下,所有元素都应该从JSF角度“启用”,并且所有启用和禁用都应该通过Javascript完成。它确实指出客户端和服务器状态在此解决方案中暂时不同步......但无论临时不匹配,它都能很好地适用于我的场景。