【问题标题】:Custom component inside <ui:repeat> doesn't find iterated item during encode<ui:repeat> 中的自定义组件在编码期间找不到迭代项
【发布时间】:2013-12-08 12:25:36
【问题描述】:

我正在尝试创建一个自定义组件来显示具有某种形式的实体。所以我创建了我的@FacesComponent 并且他正在工作,但只有当他不在像&lt;ui:repeat&gt; 这样的循环中时。当我使用以下代码时,我的组件显示价格和照片的空值,而不是名称。你有解释吗?

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>");
    }
}

非常感谢 :) 我正在尝试,但没有任何效果......

【问题讨论】:

    标签: jsf custom-component uirepeat


    【解决方案1】:

    所有对状态变化敏感的组件属性(例如,依赖于&lt;ui:repeat var&gt;的值,至少在视图构建时不知道但仅在视图渲染时不知道的那些属性),必须委托属性的存储通过继承的getStateHelper() 方法为状态助手提供值。

    启动示例:

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

    对所有其他属性应用相同的内容并去掉实例变量声明。重要提示是状态助手键(上例中的"price")必须完全与属性名称相同。

    另见:

    【讨论】:

    • 是的,就是这样!非常感谢:)
    • 我想知道...是否可以将 List 从我的 XHTML 页面传递给我的自定义组件?因为我正在尝试并且我得到了 NullPointerException ...
    猜你喜欢
    • 2011-08-02
    • 2012-01-29
    • 2014-09-08
    • 2012-03-26
    • 2011-05-26
    • 2012-02-19
    • 2022-08-14
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多