Пользовательский компонент внутри ‹ui:repeat› не находит повторяющийся элемент во время кодирования

Я пытаюсь создать собственный компонент для отображения объекта с определенной формой. Итак, я создал свой @FacesComponent, и он работает, но только тогда, когда он не находится внутри цикла, такого как <ui:repeat>. Когда я использую следующий код, мой компонент отображает нулевые значения для цены и фотографии, но не для имени. У вас есть объяснение?

XHTML-код:

<ui:define name="content">
    <f:view>
        <h:form>
            <ui:repeat value="#{dataManagedBean.listNewestCocktails}" var="item" varStatus="status">
                <h:outputText value="#{item.price}"/> <!--working very well-->
                <t:cocktailVignette idPrefix="newCocktails" name="foo" price="#{item.price}" urlPhoto="#{item.photoURI}"/>   <!-- not working the getPrice here -->
            </ui:repeat>

            <!--<t:cocktailVignette idPrefix="allCocktails" name="OSEF" price="20" urlPhoto="osefdelurl" ></t:cocktailVignette> -->
        </h:form>               
    </f:view> 

Код моего компонента:

    package component;

import java.io.IOException;
import javax.faces.context.FacesContext;
import javax.faces.component.FacesComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.ResponseWriter;

@FacesComponent(value = "CocktailVignette")
public class CocktailVignette extends UIComponentBase {

    private String idPrefix;
    private String name;
    private String price;
    private String urlPhoto;

    public String getIdPrefix() {
        return idPrefix;
    }

    public void setIdPrefix(String idPrefix) {
        this.idPrefix = idPrefix;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getUrlPhoto() {
        return urlPhoto;
    }

    public void setUrlPhoto(String urlPhoto) {
        this.urlPhoto = urlPhoto;
    }

    @Override
    public String getFamily() {
        return "CocktailVignette";
    }

    @Override
    public void encodeBegin(FacesContext context) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        writer.write("<div id=\""+idPrefix+name+"\" class=\"cocktail-vignette\">");
        writer.write("<h2>"+name+"</h2>");
        writer.write("<h3>"+price+"</h3>");
        writer.write("</div>");
    }
}

Большое спасибо :) Я пытаюсь, но ничего не получается...


person Ko2r    schedule 23.11.2013    source источник


Ответы (1)


Все атрибуты компонента, которые чувствительны к изменениям состояния (например, значение, зависящее от <ui:repeat var>, по крайней мере те, которые неизвестны во время построения представления, но только во время рендеринга представления), должны делегировать хранение значения атрибута помощнику состояния. как доступно унаследованным getStateHelper()< /а> метод.

Пример начала:

public String getPrice() {
    return (String) getStateHelper().eval("price");
}

public void setPrice(String price) {
    getStateHelper().put("price", price);
}

Примените то же самое для всех других атрибутов и избавьтесь от объявлений переменных экземпляра. Важное примечание: вспомогательный ключ состояния ("price" в приведенном выше примере) должен быть точно таким же, как имя атрибута.

Смотрите также:

person BalusC    schedule 23.11.2013
comment
ДА было именно так! Большое спасибо :) - person Ko2r; 23.11.2013
comment
Мне было интересно... можно ли передать List‹Entity› с моей XHTML-страницы на мой пользовательский компонент? Потому что я пытаюсь и получаю исключение NullPointerException... - person Ko2r; 23.11.2013