【问题标题】:Action not triggered when button is enabled/disabled with ajax使用 ajax 启用/禁用按钮时未触发操作
【发布时间】:2012-02-22 10:53:40
【问题描述】:

我遇到了一个对我没有任何意义的问题。我有一个使用简单 Ajax 触发 selectionChange-Events 的列表框。这个想法是在选择列表中的项目之前不会启用编辑按钮。所以我创建了以下代码。

<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 中的 add-和 edit-method 中添加了一些 sysout,并且从未调用 edit-method )...而不是 html 更改。上面的代码嵌套在一个简单的 div 中。当我单击编辑时,整个表单都在该 div 之外。

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

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

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

感谢任何帮助。谢谢

【问题讨论】:

  • 您不需要重新渲染整个表单,因为 commandButton 操作将附加到 html 表单元素?
  • 我试过了,但没有帮助。此外,为什么我需要呈现表单?我希望由此创建的 JavaScript 只会更改 DOM 树中的按钮。
  • 这只是一个猜测。我不太确定禁用/启用是如何实现的。您是否尝试过相同的渲染,例如有两个按钮有条件地呈现?
  • 还没有。但是当我记得当时使用“渲染”时,我必须重新加载整个页面,这有点多。

标签: ajax jsf-2


【解决方案1】:

您已链接的答案的第 5 点涵盖了此问题。

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

我建议将BikeManagementPanelBean上的@RequestScoped更改为@ViewScoped

【讨论】:

  • Ups :-D 我已经读到 ViewScoped 是最好的方法,但我使用的 CDI 没有这个范围 :-/ 当我遵循上面的语句时(在 postconstruct 中预初始化条件) :这是否意味着该属性将始终保持为假(在我的情况下,因为如果没有发生选择,则应禁用该按钮)?
  • 如果您根据某些请求参数正确预初始化它,则不会。提交的下拉值可用作请求参数。是的,这很难看,这就是视图范围存在的原因,这样您在与同一个视图交互时就不需要摆弄请求参数。至于 CDI 中的视图范围,最好的选择是@ConversationScoped
  • 再次感谢。我会试试的。使用 ViewParameter 应该是可能的。
  • @lostiniceland:不,为时已晚。它将在更新模型值阶段设置值,而您在应用请求值阶段需要它。那时 JSF 将确定要调用的操作。你需要@ManagedProperty("#{param['clientId:of:menu']}")
【解决方案2】:

试试这样的

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

尝试使用&lt;h:panelGroup&gt; 再次包装它并呈现而不是按钮...

【讨论】:

  • 感谢您的快速回复。不幸的是,包装并不能解决这个问题,渲染表单也不能解决(请参阅问题的第二条评论)
  • 几乎 :-D 它仍然无法正常工作,但是当我打开页面时启用按钮时......触发了操作。所以看起来一旦发生了ajax调用,它就会把事情搞砸。我查看了 html-source 但这里没有任何变化。是否有另一个显示实际 DOM 的 Firefox 附加组件?
  • 你可以使用ui:debug查看DOM
  • 尝试用 再次包装它并呈现而不是按钮...
  • eq false 究竟是如何改变表达式的?这没有任何意义。
猜你喜欢
  • 2013-04-29
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多