我在JSF页面中有以下内容:
<h:commandLink action="#{manager.removeEntity(row.id)}" value="Remove">
<f:ajax event="action" render=":form:table" />
</h:commandLink>
渲染效果很好,但在执行操作之前,呈现组件。 (我通过记录知道这一点)
在服务器上执行动作功能后,有没有办法渲染组件?
非常感谢任何帮助
更新1
我删除了action属性并为标记添加了一个监听器,但不幸的是它似乎没有帮助,在渲染组件树之后仍然会调用该方法。
答案 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
)
答案 2 :(得分:0)
更改前:
<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;。这会呈现页面,但是当他们确认商务逻辑完成时。是的。这可能令人困惑。好吧,无论你评论什么,我都会尽快回复(可能不那么快)。