![](/img/trans.png)
[英]Specifying default a4j:commandButton when press Enter in JSF form
[英]JSF a4j:commandButton not working when 'disabled' is set
當我在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>
有任何想法嗎? 謝謝!
編輯:
我嘗試將t:dataTable上的prepareDataModel =“ true”設置為無效。
我還進行了一個測試,該測試具有a4j:commandButton和沒有數據表的文本框,但仍未觸發backing 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;
}
謝謝!
在HTML世界中, disabled
屬性導致任何HTML輸入元素( input
, select
, textarea
和button
)的name
- value
屬性對都不會發送到服務器端。
在JSF世界中, name
屬性的存在被用來標識要在服務器端調用的bean操作。 但是,在表單提交的“申請請求值”階段,JSF還會在執行任何操作之前檢查組件的disabled
(和rendered
)屬性是否為true
。
#{region}
在這里是#{MyPageBackingBean.regions}
的isMessageEmpty()
行對象,其isMessageEmpty()
getter默認情況下返回true
。 在表單的新請求中,提交#{MyPageBackingBean.regions}
顯然為空,這實際上使該按鈕處於disabled
。 然后,JSF將不會調用關聯的操作。
到目前為止,您需要確保#{MyPageBackingBean.regions}
在后續請求中返回完全相同的數據模型。 最簡單的解決方法是將MyPageBackingBean
bean放置在會話范圍內,這樣就不會在后續請求中將其重新初始化,但這也會帶來更多負面影響。 另一個解決方法是重新安排數據模型的加載,使其在bean構造函數中發生。 由於您已經在使用Tomahawk的<t:dataTable>
,因此需要將其preserveDataModel
屬性設置為true
。 有關使用數據表的更多提示,您可能會發現本文也很有用: 使用數據表 。
關於a4j:commandButton的disabled屬性要注意的另一件事:如果disabled屬性設置為true,則按鈕的onclick事件的ajax鈎子永遠不會呈現到最終HTML中。 也就是說,您將獲得如下所示的按鈕:
<input type="button" onclick="return false" ... />
代替這個:
<input type="button" onclick="A4J.AJAX.Submit('....');return false" ... />
因此,如果您想執行以下操作:
然后,您將需要執行以下操作:
這是一個簡單的例子:
<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"
/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.