2

当我在 a4j:commandButton 上包含“禁用”属性时,不会执行按钮的操作。去掉“禁用”属性会使其正常工作。我没有进行任何特殊验证(我知道),也没有看到任何验证错误消息。

这是我的页面的一部分:

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

有任何想法吗?谢谢!

编辑:

我尝试在 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>

这是用于测试的新支持 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;
   }

谢谢!

4

2 回答 2

5

在 HTML 世界中,该disabled属性会导致任何 HTML 输入元素( 、 和 )的-属性对namevalue被发送到服务器端。inputselecttextareabutton

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

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

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

于 2010-02-03T19:41:42.150 回答
1

关于 a4j:commandButton 的 disabled 属性需要注意的另一件事:如果 disabled 属性设置为 true,则按钮的 onclick 事件的 ajax 挂钩永远不会呈现到最终的 HTML 中。也就是说,你会得到一个这样的按钮:

<input type="button" onclick="return false" ... />

而不是这个:

<input type="button" onclick="A4J.AJAX.Submit('....');return false" ... />

所以,如果你想做这样的事情:

  1. 使用禁用的 a4j 渲染页面:按钮
  2. 根据用户交互在客户端启用 a4j:button
  3. 点击 a4j:button 调用服务器端动作

然后你将需要做这样的事情:

  1. 使用 a4j:button 和 disabled="#{true}" 渲染页面
  2. 让用户交互使用 disabled="#{false}" 触发重新渲染 a4j:button
  3. 点击 a4j:button 调用服务器端动作

这是一个简单的例子:

<h:selectOneCheckbox value="#{myAction.booleanProperty}">
  <a4j:support event="onclick" reRender="button1" />
</h:selectOneCheckbox>
<a4j:commandButton id="button1" action="#{myAction.doSomething}" 
  disabled="#{myAction.booleanProperty eq false}" value="click me"
/>
于 2010-04-07T18:20:50.493 回答