Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSF a4j:commandButton在';残疾人士';设定_Java_Jsf_Jakarta Ee_Richfaces_Ajax4jsf - Fatal编程技术网

Java JSF a4j:commandButton在';残疾人士';设定

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%"> ...

当我在a4j:commandButton上包含“disabled”属性时,按钮的操作不会执行。去掉“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>

谢谢

在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,我刚刚测试了您的解决方案,但它仍在删除事件