primefaces autoComplete 上第一个 itemUnselect 事件中的空值
Null value in the first itemUnselect event on primefaces autoComplete
我在使用 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" 为空,但当我搜索 select 某个对象时,"obj2" 已正确填充。任何人都知道为什么会这样?
注意:我使用的是 primefaces 5.2。
我解决了我的问题,改变了我用第一个元素填充列表的方式。
而不是这个:
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);
}
我在使用 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" 为空,但当我搜索 select 某个对象时,"obj2" 已正确填充。任何人都知道为什么会这样?
注意:我使用的是 primefaces 5.2。
我解决了我的问题,改变了我用第一个元素填充列表的方式。
而不是这个:
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);
}