【问题标题】:Null value in the first itemUnselect event on primefaces autoCompleteprimefaces autoComplete 上的第一个 itemUnselect 事件中的空值
【发布时间】:2020-06-18 14:25:38
【问题描述】:

我在使用 primefaces p:autoComplete 时遇到了一个奇怪的情况。我把这段代码放在一个 xhtml 文件中,在一个 h:form 标签内:

                    <p:autoComplete id="to" 
                                    multiple="true" 
                                    value="#{editEmailComponent.receiversEntitiesToDummy}" 
                                    completeMethod="#{editEmailComponent.completeQuery}"
                                    emptyMessage="#{text['list.empty']}"                                            
                                    var="ent"
                                    itemLabel="#{ent.class.simpleName eq 'EntityGroupHeader'? ent.design : (ent.class.simpleName eq 'EntityContactList'? ent.email : ent.abstractEntityEmail)}"
                                    itemValue="#{ent}"
                                    forceSelection="true"
                                    cache="false"
                                    styleClass="full-width"
                                    autocomplete="none">
                        <o:converter converterId="omnifaces.ListConverter" 
                                     list="#{editEmailComponent.receiversAllConverter}" />
                        <p:column>
                            <h:outputText rendered="#{(ent.class.simpleName ne 'EntityGroupHeader') and (ent.class.simpleName ne 'EntityContactList')}" value="\# #{ent.number}" />
                            <h:outputText rendered="#{ent.class.simpleName eq 'EntityGroupHeader'}" value="\# #{ent.design}" />
                            <h:outputText rendered="#{ent.class.simpleName eq 'EntityContactList'}" value="#{ent.nif}" />
                        </p:column>
                        <p:column>
                            <h:outputText rendered="#{(ent.class.simpleName ne 'EntityGroupHeader') and (ent.class.simpleName ne 'EntityContactList')}" value="#{ent.abstractEntityDesignation}" />
                            <h:outputText rendered="#{ent.class.simpleName eq 'EntityContactList'}" value="#{ent.designation}" />
                        </p:column>
                        <p:column>
                            <h:outputText rendered="#{(ent.class.simpleName ne 'EntityGroupHeader') and (ent.class.simpleName ne 'EntityContactList')}" value="#{ent.abstractEntityEmail}" />
                            <h:outputText rendered="#{ent.class.simpleName eq 'EntityContactList'}" value="#{ent.email}" />
                        </p:column>
                        <p:ajax event="query" process="@this"/>
                        <p:ajax event="itemSelect" process="@form" listener="#{editEmailComponent.onItemSelectTo}" update="to" />
                        <p:ajax event="itemUnselect" process="@form" listener="#{editEmailComponent.onItemUnselectTo}" update="to" />
                    </p:autoComplete>

与此 itemUnselect 事件关联的操作是:

  public void onItemUnselectTo(UnselectEvent event) {

    onItemUnselect(receiversEntitiesToDummy, event);
    BaseObject obj2 = (BaseObject) event.getObject();

    //Instancia da entidade e converter para receiver
    if(obj2 instanceof EntityContactList){
        EntityContactList aux = (EntityContactList) obj2;
        for(Receiver rec : receiversTo)
            if(rec.getEntity().equals(aux.getEntity()))
                receiversTo.remove(rec);
    }

    private static void onItemUnselect(List<BaseObject> list, UnselectEvent event) {        
        BaseObject obj = (BaseObject) event.getObject();   
        list.remove(obj);        
    }

我像这样初始化这个自动完成的列表:

private List<BaseObject> receiversEntitiesToDummy = new ArrayList<>();
...
EntityContactList result = entityManager.getEntityContactList(receiver.getEntity(),null);
receiversEntitiesToDummy.add(result);

因此,当我删除第一个元素时,“obj2”为空,但当我搜索并选择某个对象时,“obj2”已正确填充。有谁知道为什么会这样?

注意:我使用的是 primefaces 5.2。

【问题讨论】:

  • 先尝试 PF 6 或 7 或 8...与您的 minimal reproducible example。和/或查看他们的发行说明,也许您已经看到了修复,因此您知道它已在较新的版本中得到解决。
  • 您可以尝试从 ajax 中删除更新吗?
  • @WoAiNii 是对的,在 ajax 调用上更新自己是不好的做法。
  • 好的...但是这个操作没有任何改变。

标签: primefaces autocomplete


【解决方案1】:

我解决了我的问题,改变了我用第一个元素填充列表的方式。

而不是这个:

private List<BaseObject> receiversEntitiesToDummy = new ArrayList<>();
...
EntityContactList result = entityManager.getEntityContactList(receiver.getEntity(),null);
receiversEntitiesToDummy.add(result);

我使用查询功能放置了第一个元素,它可以工作。

EntityContactList result = entityManager.getEntityContactList(receiver.getEntity(),null);

List<BaseObject> aux = new ArrayList<>();
if(receiver.getEntity().getAbstractEntityEmail() != null)
    aux = completeQuery(receiver.getEntity().getAbstractEntityEmail());

if(aux.contains(result)){
   int num = aux.indexOf(result);
   EntityContactList another =  (EntityContactList) aux.get(num);
   receiversEntitiesToDummy.add(another);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2023-03-19
    • 2018-05-04
    • 2017-09-24
    相关资源
    最近更新 更多