JSF-Ajax-Link在链接操作之前执行部分Ajax呈现
我在JSF页面中有以下内容:JSF-Ajax-Link在链接操作之前执行部分Ajax呈现,ajax,jsf,action,render,commandlink,Ajax,Jsf,Action,Render,Commandlink,我在JSF页面中有以下内容: 虽然在执行操作之前渲染组件,但渲染效果良好。(我通过日志记录知道这一点) 在服务器上执行操作功能后,我是否有办法渲染组件 任何帮助都将不胜感激 更新1 我删除了action属性并向标记中添加了一个侦听器,尽管不幸的是它似乎没有帮助,但在呈现组件树之后仍然会调用该方法。您可以使用f:ajax的侦听器来执行逻辑,并通过以下方法之一传递行.id(删除操作=“#{manager.removeEntity(row.id)}”) 渲染工作非常完美,尽管它在执行操作之
虽然在执行操作之前渲染组件,但渲染效果良好。(我通过日志记录知道这一点)
在服务器上执行操作功能后,我是否有办法渲染组件
任何帮助都将不胜感激
更新1
我删除了action属性并向标记中添加了一个侦听器,尽管不幸的是它似乎没有帮助,但在呈现组件树之后仍然会调用该方法。您可以使用
f:ajax
的侦听器来执行逻辑,并通过以下方法之一传递行.id
(删除操作=“#{manager.removeEntity(row.id)}”
)
渲染工作非常完美,尽管它在执行操作之前渲染组件
这是而不是真的。您一定是误解了日志记录。可能是您在表值的getter方法中放置了一个log语句,错误地认为它只在呈现响应期间调用。因此,这不是真的。getter的调用次数与引用属性的EL表达式的调用次数相同。这可能发生在调用操作阶段之前和之后的不同阶段。由于在datatable中有命令链接,因此在应用请求值阶段也将调用该表的值获取方法,以便查找与链接关联的行
随日志一起传递以了解在哪个阶段调用getter方法。还要注意,在托管bean getter方法中执行业务工作(如调用数据库等)是个坏主意
另见:
有点晚,但我也有同样的问题。
ajax在我的jsf逻辑完成之前呈现。我的解决方案?嗯,我添加了一个确认对话框。我知道这不是一个技术解决方案,但嘿,它可以工作。一旦用户在对话框上按ok(大约需要一秒钟,此时应完成逻辑),应该呈现组件。祝你好运,希望这会有所帮助
更改前:
<h:commandButton action="#{bean.buisnessLogic(param1, param2)}">
<f:ajax
execute="components"
render="table"
/>
</h:commandButton>
我所做的:
在进行更改之前,我的commandButton将在添加寄存器之前呈现该表。例如,我将添加第2行,在刷新页面或添加第3行之前,它不会显示更改。我做了一些研究,我的结论是jsf将ajax标记转换为javascript,javascript直接使用ut正在等待操作完成。
解决方案:
现在我从ajax中删除了render属性,创建了另一个commandButton,并在新的commandButton中添加了render。这会呈现页面,但当他们确认业务逻辑完成时。是的。这可能会让人困惑。不管你怎么评论,我都会尽快回复(可能不会那么快).呈现阶段在应用程序逻辑阶段之后,因此您所声称的是不可能的。您能否尝试更详细地描述您的问题?您是说f:ajax的呈现发生在f:ajax的侦听器之前?您是如何做到的?
<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>
function javascriptConfirm() {
bootbox.alert("Se agrego la accion con exito.", function () {
var boton = document.getElementById("button");
boton.click();
});
e.preventdefault();
return false;
}