我从richface数据表传递一个对象,如:
<rich:column>
<a4j:commandLink
value="Transfer inside Group"
actionListener="#{adminBean.init_machineTransferInsideGroup}"
reRender="transferInsideGroupMachinePanel"
oncomplete="#{rich:component('transferInsideGroupMachinePanel')}.show()">
<f:setPropertyActionListener
target="#{adminBean.machineToChange}"
value="#{Machineassg3}" />
</a4j:commandLink>
<rich:column>
点击命令链接时,我对上述代码的期望是什么:
但正在发生的步骤是:
如何执行预期的步骤(意味着先分配然后再调用actionlistener)
答案 0 :(得分:3)
您应该在action
而不是actionListener
开展业务工作。动作监听器旨在保持自包含的逻辑,以准备/预处理真实的业务操作和/或记录某些事情,不来完成业务工作。
所以,替换
actionListener="#{adminBean.init_machineTransferInsideGroup}"
通过
action="#{adminBean.init_machineTransferInsideGroup}"
并从ActionEvent
方法中删除init_machineTransferInsideGroup()
参数。在所有动作侦听器(也是<f:setPropertyActionListener>
之一)完成其工作后,将调用动作。
答案 1 :(得分:1)
您可以使用ValueExpression
获取行变量。
假设你在dataTable声明中有属性var="machine"
,那么在托管bean的action方法中你就可以这样了
FacesContext fCtx = FacesContext.getCurrentInstance();
ELContext elCtx = fCtx.getELContext();
ExpressionFactory ef = fCtx.getApplication().getExpressionFactory();
ValueExpression ve = ef.createValueExpression(elCtx, "#{machine}", Machineassg3.class);
machineassg3 = (Machineassg3)ve.getValue(elCtx);
我不知道machineassg3
变量的实际类,所以我就像Machineassg3
一样。
我希望它有所帮助。