使用ajax启用/禁用按钮时,不会触发操作

问题描述:

我遇到了一个对我没有任何意义的问题。我有一个列表框,用简单的Ajax触发selectionChange-Events。这个想法是,编辑按钮没有被启用,直到列表中的一个项目被选中。所以我创建了下面的代码。使用ajax启用/禁用按钮时,不会触发操作

<h:form> 
    <h:selectManyListbox value="#{bean.selectedIds}"> 
     <f:selectItems value="#{bean.listOfItems}" /> 
     <f:ajax render="edit" 
      listener="#{bean.selectionChanged}" /> 
    </h:selectManyListbox> 
    <br /> 

    <h:commandButton id="add" value="#{msgs.add}" 
     action="#{bean.addNew}" /> 

    <h:commandButton id="edit" value="#{msgs.edit}" 
     disabled="#{bean.editButtonDisabled}" 
     action="#{bean.edit}" /> 
</h:form> 

按钮启用,当我想禁止,但事实证明,编辑键触发的心不是任何行动(我加了一些系统输出在bean和编辑 - 添加 - 中和编辑方法方法永远不会被调用)...而是改变html。上面的代码嵌套在一个简单的div中。当我点击编辑时,整个表单就在该div之外。

当我将这个ajax行为添加到添加按钮时,发生同样的情况,反之亦然,当我从编辑按钮中删除禁用的属性一切正常?

我已经看过BalusC的回答here但我找不到与该列表有关的任何错误。没有嵌套的表单等......它只是一个带模板的简单页面。

我在JBoss 7.1.Final上使用Mojarra 2.1.2。

任何帮助表示赞赏。由于

+0

你不需要重新渲染整个窗体,因为commandButton动作将被附加到HTML表单元素? – 2012-02-22 11:04:50

+0

我试过了,但没有帮助。此外,为什么我需要渲染表单?我预计由此创建的JavaScript只会改变DOM树中的按钮。 – lostiniceland 2012-02-22 12:19:19

+0

这只是一个猜测。我不太确定如何实现禁用/启用。您是否尝试了与渲染相同的操作,例如有两个按钮有条件呈现? – 2012-02-22 12:31:56

此问题是由应答点5所覆盖,你有联系。

组件的rendered属性和所有的父组件的过程中的形式的应用请求值相应的计算结果不是false提交请求。 JSF将重新检查它,作为防范篡改/黑客请求的一部分。将bean放入视图范围和/或确保你预先初始化bean的(后)构造函数中的条件应该修复它。 这同样适用于组件的disabled属性,在处理表单提交期间,该属性不应评估为true

我建议在BikeManagementPanelBean改变@RequestScoped@ViewScoped

+0

Ups :-D 我读过ViewScoped是最好的方式去,但我使用的CDI不是有这个范围: -/ 当我按照上面的语句(预初始化postconstruct中的条件):wouldnt这意味着该属性将始终保持为假(在我的情况下,因为按钮应该被禁用,如果没有选择发生)? – lostiniceland 2012-02-22 13:19:46

+1

如果您基于某个请求参数正确预初始化,请不要使用它。提交的下拉值可作为请求参数。是的,这很丑陋,这就是为什么视图范围存在的原因,以便您在与相同视图交互时不需要摆弄请求参数。至于CDI的观点范围,你最好的选择是'@ ConversationScoped'。 – BalusC 2012-02-22 13:21:08

+0

再次感谢。我会尝试。应该可以使用ViewParameter。 – lostiniceland 2012-02-22 13:24:42

尝试这样的事情

<h:commandButton id="edit" value="#{msgs.edit}" 
    disabled="#{bikeManagementPanelBean.editButtonDisabled eq false}" 
    action="#{bean.edit}" /> 

尝试与<h:panelGroup>再次将它包装和渲染,而不是按钮...

+0

感谢您的快速回复。不幸的是,包装并不能解决这个问题,并且渲染表单也没有(请参阅第二个问题的评论) – lostiniceland 2012-02-22 12:21:32

+0

重新编辑我的答案... – Daniel 2012-02-22 12:29:00

+0

ALMOST :-D 它仍然无法正常工作,但是当我打开该页面时启用该按钮。 ..行动被触发。所以看起来就像一旦ajax调用发生了,它就会引起一些问题。我看了一下html源代码,但这里没有任何改变。是否有Firefox的另一个附加组件显示实际的DOM? – lostiniceland 2012-02-22 12:40:27