我在PrimeFaces 5.2和客户端组件更新机制方面存在一些问题
我创建了一个网页,其中包含一个触发服务器端方法的按钮。此方法最后更新对象列表 数据表将使用列表的新内容进行更新。
<h:form>
...
<p:commandButton value="Add parameters" action="#{adminBean.addParams}"
update=":growl :#{tblSensors.clientId}" />
</h:form>
<h:form>
<p:dataTable id="tblSensors"
var="sensorElem" value="#{adminBean.sensors}"
binding="#{tblSensors}"
>
...
</p:dataTable>
</h:form>
不幸的是,当程序回调结束时,我的数据表没有更新..我真的无法找到问题。
调试阶段没有异常,我在Firebug的响应数据中没有看到任何内容。
UPDATE:我看到当调用bean方法并且某个变量已被更改时;这种变化并不持久,每次调用方法时都会错过它们
更新2:根据要求,我添加了bean代码:
@ManagedBean(name="adminBean")
@SessionScoped
public class AdminBean implements Serializable{
private List<Sensor> sensors;
public List<Sensor> getSensors() {
return sensors;
}
public void setSensors(List<Sensor> sensors) {
this.sensors = sensors;
}
//...
@PostConstruct
public void init(){
//...
//initialize sensor list
this.sensors = new ArrayList<Sensor>();
//...
}
//method for adding new sensor
public void addParams(){
try{
//add new sensor element to the list
this.sensors.add(new Sensor(this.param_name,Double.parseDouble(this.min_val),Double.parseDouble(this.max_val),
this.unit, this.selectedChartType, this.selectedFieldType, id_counter++));
}catch(Exception e){
System.out.println("Error "+e.getMessage());
System.out.println("stack "+e.getStackTrace());
}
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_INFO,"Successful", "New sensor added!"));
}
//...
}
更新3 :修复一些命名空间错误。
答案 0 :(得分:0)
虽然我不熟悉带数据绑定的dataTables,我认为update-statement不正确,你需要在触发commandButton时更新数据表
update=":growl, :tblSensors"
答案 1 :(得分:0)
为什么不指定表单ID以便更新子元素更直接?尝试:
<h:form>
...
<p:commandButton value="Add parameters" action="#{amminBean.addParams}"
update=":growl :datatableform:tblSensors" />
</h:form>
<h:form id="datatableform">
<p:dataTable id="tblSensors"
var="sensorElem" value="#{aminBean.sensors}"
binding="#{tblSensors}">
...
</p:dataTable>
</h:form>
答案 2 :(得分:0)
我解决了改变实现原则的问题:我将选项卡内容划分为2个单独的xhtml文件和相关的bean,第一个用于“父”元素管理,第二个用于子元素。
所以,第一个xhtml:
<h:form>
<p:panel id="panel" header="New Station" style="margin-bottom:10px;">
<h:panelGrid columns="2" cellpadding="5">
<p:inputText id="stationName" required="true" value="#{adminBean.stationName}"/>
<p:inputText id="description" required="true" value="#{adminBean.description}" />
<p:outputLabel value="Station type" for="stationType" />
<p:selectOneMenu id="stationType" value="#{adminBean.selectedStationType}" >
<f:selectItem itemLabel="Select Type" itemValue="-1" noSelectionOption="false" />
<f:selectItems value="#{adminBean.stationType}" />
</p:selectOneMenu>
</h:panelGrid>
</p:panel>
<p:commandButton value="Cancel" action="#{adminBean.cancella}" icon="ui-icon-check" />
<p:commandButton value="Next >" id="nextId" binding="#{nextId}" action="#{adminBean.nextStep}"
icon="ui-icon-check" update=":growl" />
</h:form>
当用户选择Next Button时,将调用一个新页面,其bean将使用与第一页相关的bean,以便检索所有需要的信息并正确显示其元数据。
这是第二页:
<h:form>
<p:panel id="panel2" header="Aggiungi sensori" style="margin-bottom:10px;">
<h:panelGrid columns="2" cellpadding="5">
<p:inputText id="param_name" required="true" value="#{adminSensorsBean.param_name}"/>
<p:selectOneMenu id="chartType" value="#{adminSensorsBean.selectedChartType}" >
<f:selectItem itemLabel="Select Type" itemValue="-1" noSelectionOption="false" />
<f:selectItem itemLabel="Line" itemValue="LINE" noSelectionOption="false" />
<f:selectItem itemLabel="Bar" itemValue="BAR" noSelectionOption="false" />
</p:selectOneMenu>
//...
<p:selectOneMenu id="fieldType" binding="#{fieldType}" value="#{adminSensorsBean.selectedFieldType}" >
<f:selectItem itemLabel="Select Field" itemValue="-1" noSelectionOption="false" />
<f:selectItems value="#{adminSensorsBean.fieldsType}" />
</p:selectOneMenu>
</h:panelGrid>
</p:panel>
<p:commandButton value="Add Sensor" id="addSensorId" binding="#{addSensorId}"
action="#{adminSensorsBean.addSensor}"
icon="ui-icon-check" update=":growl :#{tblSensors.clientId}" />
</h:form>
<h:form>
<p:dataTable id="tblSensors"
var="sensorElem"
value="#{adminSensorsBean.sensors}"
scrollable="true"
rowKey="#{sensorElem.id}"
binding="#{tblSensors}"
scrollHeight="150"
>
//...
//this table will be filled with data from form above
//...
</p:dataTable>
</h:form>
//...
<h:form>
<p:commandButton value="Submit" id="submitId" binding="#{submitId}" action="#{adminSensorsBean.saveStation}"
icon="ui-icon-check" update=":growl" />
</h:form>
通过Add Sensor按钮,将通过被调用的bean方法将新信息插入到tableView中。
@ManagedBean(name="adminSensorsBean")
@SessionScoped
public class AdminSensorsBean implements Serializable{
//Managed property from bean of first page
@ManagedProperty(value="#{adminBean}")
private AdminBean adminBean;
//...
@PostConstruct
public void init(){
//Here all second page elements as FieldType list, will be initialized using stored information from managed property.
}
//...
}
这样一切正常!老实说,我不知道为什么当我把所有代码只放在一个jsf页面时,更新事件不起作用..这是一个PrimeFaces / JSF错误吗?也许,但我不确定。 感谢您的支持,对不起我粗略的英语