3

我有 ap:menuButton,其中包含几个 p:menuitems。这些项目中的每一个都必须在会话范围的支持 bean 上调用具有特定参数的方法,并打开一个依赖于该支持 bean 的模式对话框。我的 p:menuitem 看起来像这样:

<p:menuitem value="..." oncomplete="dialog.show()" update=":dialog" actionListener="#{myController.createNewItem}">
</p:menuitem>

传递给 myController.createNewItem 的参数是唯一取决于单击哪个菜单项的参数,我尝试以 3 种方式传递它:

1)<f:setPropertyActionListener target="#{myController.newItem.property}" value="..." />

这不起作用,因为模态对话框似乎阻止了 f:setPropertyActionListener。myController.newItem.property 的设置器仅在我关闭对话框后才被调用,这还不够好。如果对话框不是模态的,它可以工作,但我真的需要它是模态的。

2) <f:attribute name="param" value="..." /> event.getComponent().getAttributes() 返回一个带有单个元素的地图,它看起来像 some_namespace.MARK_ID => 某个数字,这显然不是我想要传递的参数。

3)<f:param name="param" value="..." /> 我读到这个只适用于动作,而不是动作监听器,但无论如何都试过了。FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap() 包含我表单上的所有字段以及一些额外的参数,但不是我想要传递的参数,所以我猜它不起作用。

有什么方法可以做我在这里尝试做的事情,还是我坚持使用 f:setPropertyActionListener 和非模态对话框?谢谢。

4

2 回答 2

1

如果你想传递参数,只需使用action

<p:menuitem value="..." oncomplete="dialog.show()" update=":dialog" action="#{myController.createNewItem(your parameter)}">
</p:menuitem>

在哪里createNewItem

public void createNewItem(.....){
}

或者

public String createNewItem(.....){

     return null;
}

使用或不会做任何导航action...return nullvoid

关于ajax请求,无论如何<p:menuitem都是在幕后做的ajax

于 2012-07-04T15:39:00.307 回答
1
<p:menuitem value="menu item 1" update=":someForm:someJSFComponent" actionListener="#{myBean.myMethodItemListener}">
    <f:attribute name="theItem" value="#{itemValue}" />
</p:menuitem>



bean side:

public void myMethodItemListener(ActionEvent event) {
    itemSel = (SomeClassCasting) event.getComponent().getAttributes().get("itemValue");
}

这对我的项目有用:

<p:menuButton value="#{msg.curso}">
    <c:forEach items="#{cursoBean.cursos}" var="cursoItem">
        <p:menuitem value="#{cursoItem.nome}" update=":disciplinasForm:cursoSelLabel" actionListener="#{cursoBean.selecionaItemListener}">
            <f:attribute name="cursoItem" value="#{cursoItem}" />
        </p:menuitem>
    </c:forEach>
</p:menuButton>

public void selecionaItemListener(ActionEvent event) {
    itemSelecionado = (Curso) event.getComponent().getAttributes().get("cursoItem");
}
于 2014-01-27T03:17:53.070 回答