【问题标题】:h:commandButton action in ui:fragment sometimes not doing actionui:fragment 中的 h:commandButton 操作有时不执行操作
【发布时间】:2014-06-19 12:13:28
【问题描述】:

使用 JSF 2.1

我们有一个封装搜索结果块的表单。每个块都有一个“删除”按钮,该按钮与视图范围的支持对话并删除块(从会话范围的 bean)。

视觉上是这样的:

  -- group
    -- block (delete button)
      -- search result
    -- block 
      -- search result
    ...

当最后一个块被删除时,整个组消失。

无论如何。删除的以下实现工作正常:

<h:commandButton 
  styleClass="delete"
  action="#{backing.taBortFranTrafflista(sokning)}"
  value="#{backing.getText('trafflista.taBort')}"
  onclick="return confirm('#{backing.getText('FR100', sokning.sokbegrepp, backing.aktuelltAntalTraffar(sokning))}');"
  rendered="#{backing.javascriptEnabled}"
  disabled="#{commons.trafflistaLast}">
    <f:ajax render="@form" />
</h:commandButton>

但是,以下在 JQuery 中进行确认的实现可以工作,但不适用于最后一个搜索结果,即永远不会调用操作(分配给 h:commandButton):

<ui:fragment rendered="#{backing.javascriptEnabled}">
  <div id="dialog#{sokning.hashCode()}" title="Ta bort" class="dialog">
    <p>#{backing.getText('FR100', sokning.sokbegrepp, backing.aktuelltAntalTraffar(sokning))}</p>
    <h:commandButton 
      styleClass="delete dialog-button"
      action="#{backing.taBortFranTrafflista(sokning)}"
      value="#{backing.getText('trafflista.taBort')}"   
      onclick="closeDialog('dialog#{sokning.hashCode()}')"              
      disabled="#{commons.trafflistaLast}">
      <f:ajax render="@form" onerror="ajaxError"/>
    </h:commandButton>
    <input 
       type="submit" 
       data="dialog#{sokning.hashCode()}" 
       class="closeDialog dialog-button" 
       value="#{backing.getText('trafflista.avbryt')}" />
  </div>
  <ui:fragment rendered="#{not commons.trafflistaLast}">
    <input 
       type="submit" 
       data="dialog#{sokning.hashCode()}" 
       class="delete showDialog" 
       value="#{backing.getText('trafflista.taBort')}" />
  </ui:fragment>
  <ui:fragment rendered="#{commons.trafflistaLast}">
    <input 
       type="submit" 
       class="delete showDialog" 
       value="#{backing.getText('trafflista.taBort')}" 
       disabled="disabled"/>
  </ui:fragment>
</ui:fragment>

【问题讨论】:

  • 旁注,当组中只有一个搜索结果块时,问题(使用 ui:fragment 实现)不会发生。很奇怪。
  • 我在你给定的代码中看到了一些不太喜欢的奇怪东西。首先#{backing.getText('trafflista.taBort')}。好吧,getter 是 java 中的 getter,用于属性。他们没有争论。所以你应该将该方法重命名为textForArg(String arg)。第二件事,您的按钮是否应该导致 ajax 或整体提交行为? h:commandButton 设计为在指定 action 时表现为非 ajax。但是,您正在将它们混合在一起。查看有关标签的文档:docs.oracle.com/javaee/6/tutorial/doc/gkace.html
  • 获取/设置语法已注明。阅读有关 f:ajax 而不是 h:commandButton 操作中的 listener 属性的文档。没有效果,两种情况都是部分/ajax 请求。
  • 在工作实现中将 ui:fragment 放在 h:commandButton 周围并将渲染属性移动到片段会产生工作结果。
  • 如果从最后一个到第一个删除块不会出现问题。

标签: jsf jsf-2


【解决方案1】:

faces-redirect=true 起作用的原因是表单内的 DOM 组件与服务器表示匹配。 JQuery 对话框呈现在页面底部的表单之外。做一个等于 @all 的渲染解决了这个问题。另一种解决方案是在表单中呈现对话框。

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2013-08-27
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多