AJAX通知托管bean重点关注哪一行迭代形式

时间:2015-05-20 17:21:26

标签: ajax jsf primefaces accordion

我的每个标签中都有一个PrimeFaces p:accordionPanel,其中有一个表单:

<p:accordionPanel id="iterator" value="#{myManagedBean.itemList}" var="item" multiple="false">

    <p:tab title="#{item.name}">

        <h:form prependid="true">

            <h:outputLabel for="field1" value="Field 1:"/>
            <p:inputText id="field1" title="Field 1" value="#{item.field1}" />

            <h:outputLabel for="field2" value="Field 12:"/>
            <p:inputText id="field2" title="Field 2" value="#{item.field2}" />

我认为它是一个PrimeFaces accordionPanel是无关紧要的,例如,如果它是一个普通的JSF h:dataTable,每行都有一个表格,行为就会一样。

我想做的事情(没有详细说明原因)是,一旦用户焦点(游标)设置在迭代器的迭代中(accordionPanel,dataTable,循环在List上的任何东西),通知通过AJAX管理bean我当前所在的实体(项目)。所以如果有20行,并且因此有多个重复形式,每个代表一个item,如上面的代码所示,当我设置我的焦点时在一行的表单中,我想在托管bean setActiveEntity中触发一个setter,它将指向标识我所在行的实体或其ID(无论哪个)。

1 个答案:

答案 0 :(得分:2)

如果您有 multiple="false" (如您所示),则可以根据需要将普通PrimeFaces Accordion ajax events与activeIndex属性结合使用。由于只打开一个选项卡,因此可以在打开时获取实际选项卡(名称,索引)。

bean中的

方法:

public void onTabChange(TabChangeEvent event) {
    FacesMessage msg = new FacesMessage("Tab Changed", "Active Tab: " + event.getTab().getTitle());
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

public void onTabClose(TabCloseEvent event) {
    FacesMessage msg = new FacesMessage("Tab Closed", "Closed tab: " + event.getTab().getTitle());
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

xhtml片段:

<p:accordionPanel>
    <p:ajax event="tabChange" listener="#{tabbedView.onTabChange}" update=":form:msgs" />
    <p:ajax event="tabClose" listener="#{tabbedView.onTabClose}" update=":form:msgs" />
...

如果你有 multiple="true" ,你可以从ajax事件中获得开放和关闭,但是你永远不会知道用户正在做什么的那个然后将ajax事件处理程序添加到您的输入中,在ajax事件中,您可以获取作为事件源的组件的客户端ID。此clientId将包含&#39;索引&#39;源组件所在的行。它看起来像:

iterator:1:field1

所以像

这样的事件处理程序
public void myMethod(AjaxBehaviorEvent event){
    String clientId = ((UIComponentBase))event.getSource()).getClientId();
    // some creative string parsing here
}

会给你&#39;索引&#39;在ajax事件中。 ajax标签可以是

<p:ajax event="change" listener="#{myBean.myMethod}" />

可以通过您选择的内容填充事件(另请参阅What values can I pass to the event attribute of the f:ajax tag?

更复杂的解决方案是在纯html元素上注册jquery事件处理程序,并在单击行时使用PrimeFaces remoteCommand调用backingbean。但您可以检查h:form是否接受ajax标记中的onclick事件

<h:form>
    <f:ajax event="click" listener="#{myBean.myMethod}" />
...

您仍然需要检索&#39;索引&#39;如上所述