AJAX通知托管bean关注迭代表单的哪一行



我有一个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,无论哪个,标识我所在的行。

如果您有 multiple="false" (如您的情况),您可以使用正常的PrimeFaces Accordion ajax事件与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将包含源组件所在行的"索引"。它看起来像:

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

将在ajax事件中给你'index'。ajax标签可以是

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

其中event可以由您选择的内容填充(另请参阅我可以向f:ajax标记的event属性传递哪些值?)

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

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

您仍然需要检索'index'如上所述

相关内容

  • 没有找到相关文章

最新更新