我有<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
中之前已取消的所有项目。但问题是它始终只包含最后选择的项目而不包含之前的项目。我甚至尝试使用Vector
代替List
,但仍然有相同的结果。
我认为valueChangeListener
方法每次都会创建一个新的bean实例,以便每次都重新初始化objectClassList
。
这是真的吗?这是怎么造成的,我该如何解决?
答案 0 :(得分:2)
如果bean是请求作用域,那确实会发生。然后,每个HTTP 请求都会创建一个全新的bean实例。就那么简单。如果在同一视图上进行交互时需要具有相同的bean实例,则应将其置于视图范围内。
@ManagedBean
@ViewScoped
public class MyLdapEntry {
// ...
}
此问题与您是否使用valueChangeListener
完全无关。
无关,valueChangeListener
并非完全是执行业务操作和模型值操作的正确位置。而是使用<p:ajax listener>
代替valueChangeListener
(和<f:ajax>
)。
<p:ajax listener="#{myLdapEntry.menuValueChanged}" update=":form:objclassAttrsValstab" />
与
public void menuValueChanged() {
objectClassList.add(oneMenuselectedValue);
}