如何使用javascript禁用/重新启用JSF组件?

时间:2010-09-27 09:14:11

标签: java javascript jsf

我正在开发一个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)。

就像他认为该组件仍然被禁用。

我该如何使其有效?

3 个答案:

答案 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完成。它确实指出客户端和服务器状态在此解决方案中暂时不同步......但无论临时不匹配,它都能很好地适用于我的场景。