我是JSF的新手,在课堂上我们应该设置一个带有登录等的“Pizza-Service”。在我想要作为用户准备订单的页面上,我有一个数据表(主要数据)表)有4列。最后一个是当前单元格中类型的比萨饼数量。
我想要的是:如果我输入的数字我想设置当前的订单(到目前为止使用ajax正常工作),我只想向用户显示当前价格。这是一件不起作用的小事。
当我使用标签时,没有任何事情发生,如果我正在使用标签,我就会遇到这个错误:
<f:ajax>
包含一个未知的id“ausgabe” - 无法在组件的上下文中找到它
我的想法是将ajax标记设置为一个函数(获取当前顺序)并呈现输出文本,其中直接显示计算的价格。我用德语称这些函数为bestellungAufnehmen = takeOrder
和preisBerechnen = calculatePrice
。
谢谢有人可以帮助我!
这是xhtml:
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<p:dataTable id="table" var="pizza" value="#{model.getPizzen()}">
<p:column headerText="Nr">
<h:outputText value="#{pizza.nr}"/>
</p:column>
<p:column headerText="Artikel">
<h:outputText value="#{pizza.name}"/>
</p:column>
<p:column headerText="Preis">
<h:outputText value="#{pizza.preis}"/>
</p:column>
<p:column headerText ="Menge">
<h:inputText id="menge" value="#{bestellung.anzahl}">
<f:ajax event="keyup" render="ausgabe" listener="#{bestellung.bestellungAufnehmen(pizza)}"/>
</h:inputText>
</p:column>
</p:dataTable>
<h:outputLabel value="Zu Zahlen: "/>
<h:outputText id="ausgabe" value="#{bestellung.preisBerechnen()} €"/>
</h:form>
</h:body>
这是具有这些功能的Bean。
@Named
@SessionScoped
public class Bestellung implements Serializable {
private static int bstzaehler=0;
private int bstnr;
private Map<String,Bestellposten> posten;
private int anzahl;
public Bestellung(){
this.bstnr=++bstzaehler;
this.posten = new HashMap<>();
}
/**
* @return the bstnr
*/
public int getBstnr() {
return bstnr;
}
/**
* @param bstnr the bstnr to set
*/
public void setBstnr(int bstnr) {
this.bstnr = bstnr;
}
public void bestellungAufnehmen(Pizza pizza){
if(this.posten.containsKey(pizza.getName()) == false){
Bestellposten b = new Bestellposten(this.getAnzahl(), pizza);
this.posten.put(pizza.getName(),b);
} else {
if(this.getAnzahl() > 0 ){
Bestellposten tmp = this.posten.get(pizza.getName());
tmp.setMenge(this.getAnzahl());
} else {
this.posten.remove(pizza.getName());
}
}
System.out.println("groesse: "+posten.size());
System.out.println("akt preis: "+this.preisBerechnen());
}
/**
* @return the anzahl
*/
public int getAnzahl() {
return anzahl;
}
/**
* @param anzahl the anzahl to set
*/
public void setAnzahl(int anzahl) {
this.anzahl = anzahl;
}
public double preisBerechnen(){
double sum = 0.0;
for(String key : this.posten.keySet()){
Pizza tmp = this.posten.get(key).getPizza();
sum += tmp.getPreis() * this.posten.get(key).getMenge();
}
return sum;
}
}
答案 0 :(得分:1)
尝试为组件提供完整的限定ID:
<h:form id="frmPizza">
<p:dataTable id="table" var="pizza" value="#{model.getPizzen()}">
<p:column headerText="Nr">
<h:outputText value="#{pizza.nr}"/>
</p:column>
<p:column headerText="Artikel">
<h:outputText value="#{pizza.name}"/>
</p:column>
<p:column headerText="Preis">
<h:outputText value="#{pizza.preis}"/>
</p:column>
<p:column headerText ="Menge">
<h:inputText id="menge" value="#{bestellung.anzahl}">
<f:ajax event="keyup" render=":frmPizza:ausgabe" listener="#{bestellung.bestellungAufnehmen(pizza)}"/>
</h:inputText>
</p:column>
</p:dataTable>
<h:outputLabel value="Zu Zahlen: "/>
<h:outputText id="ausgabe" value="#{bestellung.preisBerechnen()} €"/>
</h:form>
答案 1 :(得分:1)
我认为,你应该使用update属性来更新那个outputText,比如update=":FormId:ausgabe"
<f:ajax event="keyup"
render=":frmPizza:ausgabe"
listener="#{bestellung.bestellungAufnehmen(pizza)}"
update=":frmPizza:ausgabe" />
答案 2 :(得分:1)
luiggi的解决方案有效,但由于我的“低级别”,我无法直接回答。 我现在不在我的电脑上但不是“更新”p:ajax的属性而不是f:ajax并且与渲染相同?但是我会在以后尝试一下。 THX!