【发布时间】:2019-04-29 22:06:51
【问题描述】:
芯片组件它没有更新 managebean 中的列表模型 使用下一个教程 chips u 我正在尝试更新 p:chips 组件的模型,我使用的是 Apache tomcat 9 和 primefaces 6.2,我添加了一些数据在这个使用 PostConstruct 的 List 中,数据列表显示在组件中,但是当视图中添加了一些项目时,模型管理 bean 中没有修改任何项目,查看记录器后 items.size() 保持不变,组件行为在视图按预期反应。在 Windows 机器上,它按预期工作。
我的 xhtml
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:cmp="http://xmlns.jcp.org/jsf/composite/cmp">
<h:form id="formChips">
<p:outputLabel for="items" value="Items: " /><br/>
<p:chips id="items" value="#{beanChipsViewer.items}" inmediate="true" >
<p:ajax event="itemSelect" listener="#{beanChipsViewer.chipsSelect}" update=":itemList chips"/>
<p:ajax event="itemUnselect" listener="#{beanChipsViewer.chipsDeselect}" update=":itemList chips"/>
<p:ajax event="change" process="@this" update="chips" delay="300" />
<p:ajax event="valueChange" process="@this" update="chips" delay="300" />
<p:ajax event="click" process="@this" update="chips" delay="300" listener="#{beanChipsViewer.mostrar}" />
<p:ajax event="mousedown" process="@this" update="chips" delay="300" />
<p:ajax event="mouseup" process="@this" update="chips" delay="300" />
</p:chips>
<br/>
<p:commandButton value="Save" icon="ui-icon-check" update=":itemList" action="#{beanChipsViewer.agregar()}"
actionListener="#{beanChipsViewer.mostrar}"
/>
<br/>
</h:form>
<br/>
<p:outputPanel id="itemList">
<p:repeat value="#{beanChipsViewer.items}" var="item">
<h:outputText value="#{item}"/>
<br/>
</p:repeat>
</p:outputPanel>
<h:panelGroup id="chips">
<h:outputText value="#{beanChipsViewer.items}" />
</h:panelGroup>
<br/>
这是托管的 bean 编码:
@Named
@ViewScoped
public class BeanChipsViewer implements Serializable {
private String itemSelected;
private String itemUnselected;
private static final Logger logger = LoggerFactory.getLogger(BeanChipsViewer.class);
@PostConstruct
public void init(){
for(int i=0;i<20;i++)
items.add("etiqueta "+i);
}
private List<String> items = new ArrayList<String>();
public List<String> getItems() {
return items;
}
public void setItems(List<String> items) {
this.items = items;
}
public void agregar(){
logger.info("Entra " +items.size());
items.add("nitro");
logger.info("zize after intro" +items.size());
UtilsPrimefaces.executeUpdatePF("itemList");
}
public void mostrar(){
logger.info("Entra mostrar");
for(String m:items){
logger.info("chipItem "+ m);
}
}
public void chipsSelect(SelectEvent e){
logger.info("chip seleted"+e.getObject().toString());
this.setItemSelected(e.getObject().toString());
items.add(e.getObject().toString());
logger.info("items size afteR chipselected "+ items.size());
}
public void chipsDeselect(UnselectEvent e){
logger.info("chip deselect"+e.getObject().toString()+" "+items.size());
this.setItemUnselected(e.getObject().toString());
}
public void phaseListener(PhaseEvent e){
List<FacesMessage> messages = e.getFacesContext().getMessageList();
System.out.println(messages.size());
}
【问题讨论】:
-
为什么你有 inmediate="true" 会跳过所有验证和绑定。
-
您好,感谢您的评论,没有 inmediate="true",仍然是相同的行为,我无法升级 primefaces 版本,因为它是旧系统维护。
-
如果您要添加新特性/功能,如何进行维护?维护也是您经常对汽车进行的操作。用新油更换旧油,更换过滤器......与用新油更换旧 PrimeFaces 相同
-
okey @Kukeltje 感谢您的观察。
标签: jsf primefaces