jsf中更新输出文本字段的ajax问题

时间:2014-05-21 19:02:40

标签: ajax jsf primefaces

我是JSF的新手,在课堂上我们应该设置一个带有登录等的“Pizza-Service”。在我想要作为用户准备订单的页面上,我有一个数据表(主要数据)表)有4列。最后一个是当前单元格中类型的比萨饼数量。

我想要的是:如果我输入的数字我想设置当前的订单(到目前为止使用ajax正常工作),我只想向用户显示当前价格。这是一件不起作用的小事。

当我使用标签时,没有任何事情发生,如果我正在使用标签,我就会遇到这个错误:

  

<f:ajax>包含一个未知的id“ausgabe” - 无法在组件的上下文中找到它

我的想法是将ajax标记设置为一个函数(获取当前顺序)并呈现输出文本,其中直接显示计算的价格。我用德语称这些函数为bestellungAufnehmen = takeOrderpreisBerechnen = 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;
    }
}

3 个答案:

答案 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!