JSF Ajax Link在链接操作之前执行部分ajax呈现

时间:2012-03-11 08:00:51

标签: ajax jsf action render commandlink

我在JSF页面中有以下内容:

<h:commandLink action="#{manager.removeEntity(row.id)}" value="Remove">
    <f:ajax event="action" render=":form:table" />
</h:commandLink>

渲染效果很好,但在执行操作之前,呈现组件。 (我通过记录知道这一点)

在服务器上执行动作功能后,有没有办法渲染组件?

非常感谢任何帮助

更新1

我删除了action属性并为标记添加了一个监听器,但不幸的是它似乎没有帮助,在渲染组件树之后仍然会调用该方法。

3 个答案:

答案 0 :(得分:1)

<h:commandLink action="#{manager.removeEntity(row.id)}" value="Remove">
    <f:ajax event="action" render=":form:table" />
</h:commandLink>
     

渲染效果很好,但在执行操作之前渲染组件。 (我通过记录知道这一点)

为真。您必须误解日志记录。也许你已经在表的值的getter方法中放入了一个日志语句,误以为它在渲染响应期间只调用了 。因此不是这样。当引用属性的EL表达式被评估时,多次调用getter。这可能发生在调用操作阶段之前和之后的不同阶段。当你在数据表中有命令链接时,表的值getter方法也会在应用请求值阶段被调用,以便找到与链接相关联的行。

FacesContext#getCurrentPhaseId()与日志一起传递,以了解调用getter方法的阶段。另请注意,在托管bean getter方法中执行业务工作(如调用数据库等)是一个坏主意。

另见:

答案 1 :(得分:0)

您可以使用listener的{​​{1}}来执行您的逻辑,并使用以下方式之一传递f:ajax(删除row.id

Pass a parameter on ajax call 1

Pass a parameter on ajax call 1

答案 2 :(得分:0)

有点晚了,但我遇到了同样的问题。 在我的jsf逻辑完成之前,ajax呈现。我的解决方案那我添加了一个确认对话框。我知道它不是技术解决方案但是嘿,它有效。一旦用户在对话框上按下ok(大约需要一秒钟,此时逻辑应该完成),应该渲染组件。祝你好运希望这会有所帮助。

更改前:

<h:commandButton action="#{bean.buisnessLogic(param1, param2)}">
  <f:ajax
      execute="components"
      render="table"
  />
</h:commandButton>

变更后:

<h:commandButton onclick="javascriptCofirm();" action="#{bean.buisnessLogic(param1, param2)}">
  <f:ajax
      execute="components"
  />
</h:commandButton>
<h:commandButton id="button" style="display: none">
  <f:ajax
     render="table"
  />
</h:commandButton>

的javascript:

function javascriptConfirm() {
   bootbox.alert("Se agrego la accion con exito.", function () {
      var boton = document.getElementById("button");
      boton.click();
   });
   e.preventdefault();
   return false;
}

我做了什么:

 在改变之前确定如此。我的commandButton会在添加寄存器之前呈现表。例如,我会添加第2行,在刷新页面或添加第3行之前,它不会显示更改。我做了一些研究,我的结论是jsf将ajax标签翻译成javascript,javascript直接执行代码而不等待动作完成。

解:

所以现在我从ajax中删除了render属性,然后我创建了另一个commandButton,并在新的commandButton中添加了渲染。 javascriptConfirm方法调用按钮并点击它&#34;。这会呈现页面,但是当他们确认商务逻辑完成时。是的。这可能令人困惑。好吧,无论你评论什么,我都会尽快回复(可能不那么快)。