5

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

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

渲染工作完美,尽管它在执行操作之前渲染组件。(我通过日志知道这一点)

在服务器上执行操作功能后,我有什么方法可以渲染组件吗?

任何帮助将不胜感激

更新 1

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

4

3 回答 3

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

渲染工作完美,尽管它在执行操作之前渲染组件。(我通过日志知道这一点)

不是真的。您一定是误解了日志记录。也许您在表值的 getter 方法中放置了一条日志语句,误认为它在渲染响应期间调用。因此这是不正确的。调用 getter 的次数与评估引用该属性的 EL 表达式的次数一样多。这可能发生在调用操作阶段之前和之后的不同阶段。由于您在数据表中拥有命令链接,因此在应用请求值阶段也将调用表的 value getter 方法,以查找与链接关联的行。

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

也可以看看:

于 2012-03-11T14:51:20.417 回答
0

您可以使用 的listenerf:ajax执行您的逻辑并通过row.id以下方式之一传递 (删除action="#{manager.removeEntity(row.id)}"

在 ajax 调用 1 上传递参数

在 ajax 调用 1 上传递参数

于 2012-03-11T09:30:39.880 回答
0

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

改动前:

<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 方法调用按钮并“单击它”。这会呈现页面,但在他们确认业务逻辑完成时。是的。这可能令人困惑。好吧,无论您发表什么评论,我都会尽快回复(可能不会那么快)。

于 2016-03-14T21:47:31.250 回答