PrimeFaces

时间:2013-06-12 10:37:44

标签: primefaces

尝试从p:galleria组件内部创建命令链接时遇到问题 问题是尽管在运行时事实上链接值value="Show present #{present.name} #{present.presentId}"包含id的正确值作为示例value="Show present Foo 1",当按下命令链接时它每次都发送第二个对象的错误id

<h:form>
    <p:galleria value="#{presentBean.allPresentList}" var="present" panelWidth="500" panelHeight="313" showCaption="true">  
        <f:facet name="content">
            <h:commandLink value="Show present #{present.name} #{present.presentId}"                   action="pretty:present" actionListener="#{presentBean.setPresentObj}">
                <f:attribute name="present" value="#{present.presentId}"/>
              </h:commandLink>
        </f:facet>
    </p:galleria> 
</h:form>

@ManagedBean(name="presentBean")
@SessionScoped
public class PresentBean implements Serializable{

    ArrayList<Present> allUserPresentList = new ArrayList<Present>();

    @PostConstruct
    private void usersPresent(){
        PresentDao presentDao = new PresentDaoImpl();
        allPresentList = (ArrayList<Present>) presentDao.findAllPresents();
    }

    public ArrayList<Present> getAllUserPresentList() {
        return allUserPresentList;
    }

    public void setAllUserPresentList(ArrayList<Present> allUserPresentList) {
        this.allUserPresentList = allUserPresentList;
    }

    private String presentId ;

    public String getPresentId() {
        return presentId;
    }

    public void setPresentId(String presentId) {
        this.presentId = presentId;
    }

    public void setPresentObj(ActionEvent ev){
        Object presentOb = ev.getComponent().getAttributes().get("present");
        if(presentOb != null){
            this.presentId = (String) presentOb;
        }else{
            presentId = null ;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您需要使用setPropertyActionListener而不是<f:attribute name="present" value="#{present.presentId}"/>,因为f:attribute标记仅在创建组件时(仅一次)评估,而不是在组件基于迭代行生成html时评估。

所以你需要改为使用:

 <f:setPropertyActionListener target="#{presentBean.presentId}" value="#{present.presentId}" />

这将在托管bean中设置presentId的值,因此在您的操作方法中,您只需访问presentId本身而无需将其解决。

或者,如果您使用的是更高版本的JSF(使用Servlet 3.0或更高版本),那么您可以在托管bean中创建一个方法,该方法将presentId或甚至当前对象作为参数

e.g。在您的托管bean中:

 public void myAction(Present p){
       //do whatever you want with the Present object
    }

并在你的.xhtml中:

<h:commandLink value="Show present #{present.name} #{present.presentId}"         actionListener="#{presentBean.myAction(present)}">
</h:commandLink>