Java JSF a4j:commandButton在';残疾人士';设定
当我在a4j:commandButton上包含“disabled”属性时,按钮的操作不会执行。去掉“disabled”属性会使其正常工作。我没有做任何特殊验证(我知道),也没有看到任何验证错误消息 这是我页面的一部分:Java JSF a4j:commandButton在';残疾人士';设定,java,jsf,jakarta-ee,richfaces,ajax4jsf,Java,Jsf,Jakarta Ee,Richfaces,Ajax4jsf,当我在a4j:commandButton上包含“disabled”属性时,按钮的操作不会执行。去掉“disabled”属性会使其正常工作。我没有做任何特殊验证(我知道),也没有看到任何验证错误消息 这是我页面的一部分: <t:dataTable id="myTable" var="region" value="#{MyPageBackingBean.regions}" width="100%"> ...
<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>
谢谢 在HTML世界中,禁用的
属性导致任何HTML输入元素(输入
,选择
,文本区域
和按钮
)的名称
-值
属性对不会发送到服务器端
在JSF世界中,name
属性的存在被用来标识要在服务器端调用的bean操作。然而,在表单submit的apply request values阶段,JSF还检查组件的已禁用
(和呈现
)属性是否在采取任何操作之前评估true
这里的{region}
是{MyPageBackingBean.regions}
的迭代表行对象,其isMessageEmpty()
getter默认返回true
。在表单提交的新请求中,{MyPageBackingBean.regions}
显然是空的,这使得按钮被禁用。JSF将不会调用相关的操作
在这一点上,您需要确保#{MyPageBackingBean.regions}
在后续请求中返回完全相同的数据模型。最简单的修复方法是将MyPageBackingBean
bean放在会话范围内,这样它就不会在后续请求中重新初始化,但这也会产生更多的负面影响。另一个修复方法是重新安排数据模型加载,以便它发生在bean构造函数中。由于您已经在使用Tomahawk的
,因此需要将其preserveDataModel
属性设置为true
。有关使用datatables的更多提示,您可能会发现本文也很有用:。关于a4j:commandButton的disabled属性还有一点需要注意:如果disabled属性设置为true,则按钮onclick事件的ajax钩子永远不会呈现到最终的HTML中。也就是说,你会得到这样一个按钮:
<input type="button" onclick="return false" ... />
与此相反:
<input type="button" onclick="A4J.AJAX.Submit('....');return false" ... />
所以,如果你想做这样的事情:
<input type="button" onclick="return false" ... />
使用禁用的a4j:按钮呈现页面
基于用户交互在客户端启用a4j:按钮
单击a4j:按钮调用服务器端操作
然后,您将需要执行以下操作:
<input type="button" onclick="return false" ... />
使用a4j:按钮并禁用=“#{true}”呈现页面
使用disabled=“#{false}”,让用户交互触发a4j:按钮的重新渲染
单击a4j:按钮调用服务器端操作
下面是一个简单的例子:
<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"
/>
您是否检查了禁用的值是否没有计算为true?逻辑很简单,因此应该计算为true,但我没有明确测试。你知道我在哪里吗?我正在使用IntelliJ 8和JBoss 5。谢谢你提供的信息,我一定会尝试一下。我打赌我的部分问题可能是MyPageBackingBean是请求范围的。也许preserveDataModel会有帮助。preserveDataModel没有这样的运气,或者将commandbutton和文本框移出datatable(请参见我编辑的问题)。不过,支持bean的作用域是请求,这可能就是问题所在。有什么想法吗?也许它不适合ajaxical请求。我没有广泛地做过a4j,所以我不能保证工作正常,但理论上,在特定的请求范围bean上使用
应该可以解决这个问题;在请求范围内时,我尝试在支持bean上使用t:saveState(不是a4j:keepAlive,这可能会很有趣),但没有帮助。t:dataTable上的“preserveDataModel”也没有帮助,但值得一试。谢谢@Drtooth,我刚刚测试了您的解决方案,但它仍在删除事件