Mojarra 2.2
我有两个豆子。
public class MyBean1{
private String myProperty1;
//GET, SET, CTOR
public void doAction(){
//assign something to myProperty1
}
}
public class MyBean2{
private String myProperty2;
//GET, SET, CTOR
}
现在,我需要在MyBean1::myProperty1
方法调用之后通过单击按钮将属性MyBean2::myProperty2
的值分配给doAction()
:
<h:commandButton action="#{myBean1.doAction}">
<f:setPropertyActionListener target="#{myBean2.myProperty2}"
value="#{myBean1.myProperty1}" />
</h:commandButton>
但它不起作用。我发现它由于以下原因而无法正常工作:
单击按钮会导致ActionEvent
广播。它通过此方法执行(javax.faces.component.UICommand
):
public void broadcast(FacesEvent event) throws AbortProcessingException {
super.broadcast(event); //1 <-------------------- HERE
if (event instanceof ActionEvent) {
FacesContext context = getFacesContext();
MethodBinding mb = getActionListener();
if (mb != null) {
mb.invoke(context, new Object[] { event });
}
ActionListener listener =
context.getApplication().getActionListener();
if (listener != null) {
listener.processAction((ActionEvent) event);
}
}
}
我注意到点击该按钮的ActionEvent
广播由两位听众处理,一位来自super.broadcast(event)
//1
com.sun.faces.facelets.tag.jsf.core.SetPropertyActionListenerHandler.SetPropertyListener
的{{1}} MyBean1:getMyProperty1()
在 调用操作方法之前, 执行处理。
当然,我可以将动作方法invokation嵌入到myProperty1
getter中,因此 $('.box-menu').each (index, value) ->
@boxes.push new LW.Box.Box @ajax, $(this).data('type')
字段将被正确初始化,但对我来说似乎非常奇怪。实现这一目标的正确方法是什么?