JSF a4j:设置'disabled'时commandButton不工作

Jon*_*ott 2 java jsf richfaces java-ee ajax4jsf

当我在a4j:commandButton上包含'disabled'属性时,不执行按钮的操作.取消"禁用"属性会使其正常工作.我没有做任何特殊验证(我知道)并且没有看到任何验证错误消息.

这是我的页面的一部分:

<t:dataTable id="myTable"
             var="region"
             value="#{MyPageBackingBean.regions}"
             width="100%">

...

<a4j:commandButton value="Update"
                   action="#{region.doUpdate}"
                   oncomplete="alert('done');"
                   disabled="#{!empty region && region.messageEmpty}"
                   immediate="true"/>

...

</t:dataTable>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢!

编辑:

我尝试在t:dataTable上设置preserveDataModel ="true"无效.

我还做了一个测试有一个a4j:commandButton和没有数据表的文本框,但仍然没有触发支持bean操作:

      <h:form>
     <a4j:region>
        <a4j:outputPanel id="testregion">
        <h:messages id="messages"/>

                          <a4j:status>
                             <f:facet name="start">
                                <h:graphicImage value="/images/progress_indicator.gif"/>
                             </f:facet>
                          </a4j:status>

                       <h:inputTextarea
                             rows="5"
                             value="#{MyPageBackingBean.myValue}"
                             style="width:100%; border: 1px solid #99CCFF;">
                          <a4j:support event="onkeyup"
                                       reRender="testregion"
                                       eventsQueue="messageModificationQueue"
                                       ignoreDupResponses="true"
                                       requestDelay="500"/>
                       </h:inputTextarea>

                       <a4j:commandButton id="doDelete"
                                          value="Delete"
                                          action="#{MyPageBackingBean.dummy}"
                                          reRender="testregion"
                                          disabled="#{empty MyPageBackingBean.myValue}"/>
                    <h:outputText value="#{MyPageBackingBean.myValue}"/>
        </a4j:outputPanel>
     </a4j:region>
  </h:form>
Run Code Online (Sandbox Code Playgroud)

以下是用于测试的新支持bean代码:

private String m_myValue = null;
   public String getMyValue()
   {
      return m_myValue;
   }
   public void setMyValue(String value)
   {
      m_myValue = value;
   }
   private String mystr2 = null;
   public String dummy()
   {
      mystr2 = "hello";
      return null;
   }
Run Code Online (Sandbox Code Playgroud)

谢谢!

Bal*_*usC 5

在HTML中的世界里,disabled属性促使name- value属性对任何HTML输入元件(input,select,textareabutton)不被发送到服务器侧.

在JSF世界中,name属性的存在用于标识要在服务器端调用的bean操作.但是,在表单提交的应用请求值阶段,JSF还会在采取任何操作之前检查组件的disabled(和rendered)属性是否进行评估true.

这里#{region}是一个迭代的表行对象,默认情况下返回#{MyPageBackingBean.regions}isMessageEmpty()getter true.在表单提交的新请求中,#{MyPageBackingBean.regions}显然是空的,有效地生成按钮disabled.然后,JSF不会调用相关的操作.

到目前为止,您需要确保#{MyPageBackingBean.regions}在后续请求中返回完全相同的datamodel.最简单的修复方法是将MyPageBackingBeanbean放在会话范围内,以便它不会在后续请求中重新初始化,但这也会产生更多的负面影响.另一个修复是重新排列数据模型加载,以便它在bean构造函数中发生.由于您已经在使用Tomahawk <t:dataTable>,您需要将其preserveDataModel属性设置为true.有关使用数据表的更多提示,您可能会发现本文也很有用:使用数据表.