1

我有一个<p:selectOneMenu>条目String和一个valueChangeListener关于它的。

看法:

<p:selectOneMenu value="#{myLdapEntry.oneMenuselectedValue}" effect="fade" style="font-size:12px;"
    valueChangeListener="#{myLdapEntry.menuValueChanged}">
    <f:selectItem itemLabel="" itemValue=""/>
    <f:selectItems value="#{treeBean.objclasslist}" var="objclass"
    itemLabel="#{objclass}" itemValue="#{objclass}" />
    <p:column>   
        #{o}  #{objclass}
    </p:column>
    <f:ajax event="change" render=":form:objclassAttrsValstab" />
</p:selectOneMenu>

模型:

List<String> objectClassList = new ArrayList<String>();

public void menuValueChanged(ValueChangeEvent vce) {
    String newValue = vce.getNewValue().toString();
    objectClassList.add(newValue);
    System.out.println(objectClassList);
}

我想记住objectClassList. 但问题是它总是只包含最后一个选定的项目,而不是之前的项目。我什至尝试过使用 aVector而不是 a List,但仍然得到相同的结果。

我认为该valueChangeListener方法每次都会创建一个新的 bean 实例,以便objectClassList每次都重新初始化。

这是真的?这是如何引起的,我该如何解决?

4

1 回答 1

2

如果 bean 是请求范围的,那确实会发生。然后,每个 HTTP请求都会创建一个全新的 bean 实例。就那么简单。如果您需要在同一个视图上交互时拥有相同的 bean 实例,那么它应该被放置在视图范围内。

@ManagedBean
@ViewScoped
public class MyLdapEntry {
   // ... 
}

这个问题与你是否使用完全无关valueChangeListener

也可以看看:


与具体问题无关valueChangeListener,这并不完全是执行业务操作和模型值操作的正确位置。而是使用<p:ajax listener>代替valueChangeListener(and <f:ajax>)。

<p:ajax listener="#{myLdapEntry.menuValueChanged}" update=":form:objclassAttrsValstab" />

public void menuValueChanged() {
    objectClassList.add(oneMenuselectedValue);
}

也可以看看:

于 2012-10-17T11:45:36.427 回答