【问题标题】:How to disable/re-enable JSF component using javascript? [duplicate]如何使用 javascript 禁用/重新启用 JSF 组件? [复制]
【发布时间】:2011-04-17 16:11:08
【问题描述】:

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

好像他认为该组件仍然处于禁用状态。

我怎样才能使它工作?

【问题讨论】:

  • 没有这个功能还能用吗?你能发布bean代码吗?
  • 启用和禁用组件正在工作。但是获取我从我的列表中选择的元素的值 donc 工作。当我将 h:selectOneMenu 的属性 disabled 设置为 false 时,我得到所选元素的值。

标签: java javascript jsf


【解决方案1】:

问题是您仅在客户端启用组件。在服务器端它总是disabled="true"。要完成这项工作,您必须:

一个。将组件的 disabled 属性分配给最初为“true”的托管 bean 属性

disabled="#{myController.valueChDisableStatus}"

b.在你的 h:form 中插入 window.onload = callScript

c。最后,在myController#someAction 方法中将valueChDisableStatus 属性设置为false

我现在无法检查解决方案,但我相信它会正常工作。

【讨论】:

    【解决方案2】:

    我找到了这个解决方案。

    <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
    }
    

    【讨论】:

      【解决方案3】:

      这些解决方案都不适合我。

      虽然从托管 bean 值设置元素的 disabled 属性工作正常,并且通过 javascript 更改它的值也工作正常,但一旦提交表单,仍然没有达到“someaction”方法,以便“将 valueChDisableStatus 属性设置为错误的”。此外,我发现即使我的托管 bean 有一个 isDisabled() 和一个 setDisabled(boolean value),但 setDisabled() 方法在提交表单后从未被调用(当然),尽管 isDisabled() 是。所以我无法找到使用这些解决方案将托管 bean 的“disabledElement”值更改为 false 的方法。

      我确实在此链接中找到了对我有用的解决方案: http://blog.michaelscepaniak.com/jsf-you-cant-submit-a-disabled-form-element

      基本上它建议默认情况下所有元素都应该从 JSF 角度“启用”,并且所有启用和禁用都应该通过 Javascript 完成。它确实指出客户端和服务器状态在此解决方案中暂时不同步......但无论暂时不匹配如何,它都适用于我的场景。

      【讨论】:

      猜你喜欢
      • 2011-03-28
      • 2011-04-03
      • 1970-01-01
      • 2015-03-04
      • 2015-08-06
      • 1970-01-01
      • 2016-09-25
      • 2018-07-15
      相关资源
      最近更新 更多