有关PrimeFaces部分过程的问题

时间:2012-06-05 10:46:34

标签: java jsf-2 primefaces listener

在我的应用程序中,我有这个托管bean:

@ManagedBean(name = "mrBean")
@RequestScoped
public class MrBean {


    @ManagedProperty(value = "#{param.id}")
    private Long   commentableID;
    private String comment;

    @PostConstruct
    public void init() {
        System.out.println("INIT " + commentableID);
    }

    public void postComment() {
        System.out.println("POST COMMENT " + commentableID);
    }

    public void like(boolean like) {
        System.out.println("LIKE " + commentableID);
    }

    // Getters and Setters

}

问题1:

在查看文章的页面上,我有以下方框进行评论。

<h:panelGrid columns="1">
    <p:inputTextarea id="comment" value="#{mrBean.comment}" />

    <p:commandButton actionListener="#{mrBean.postComment}" value="Post">
        <f:param name="id"  value="#{viewCommentable.commentableID}" />
    </p:commandButton>
</h:panelGrid>

使用上面的代码,一切正常。但是,由于postComment()函数只需要comment属性,因此我尝试将process='comment'放入上面的p:commandButton。此时,每当我单击Post按钮时,我总是在控制台上看到INIT [commentableID]。但是,我从未见过POST COMMENT [commentableID]。换句话说,即使正确创建了bean,也从未调用过侦听器方法postComment()

问题2:

在同一页面上,我有以下切换按钮,用于喜欢/不喜欢文章。

<h:inputHidden id="commentableID" value="#{mrBean.commentableID}" />

<p:selectBooleanButton id="like" value="#{viewCommentable.commentable.liked}" onLabel="Liked" offLabel="Like" >
    <p:ajax process="like dislike commentableID" listener="#{mrBean.like(viewCommentable.commentable.liked)}" />
</p:selectBooleanButton>

<p:selectBooleanButton id="dislike" value="#{viewCommentable.commentable.disliked}" onLabel="Liked" offLabel="Like" >
    <p:ajax process="like dislike commentableID" listener="#{mrBean.dislike(viewCommentable.commentable.disliked)}" />
</p:selectBooleanButton>

这些按钮工作正常。但是,我观察到的很奇怪。当我单击Like按钮时,在控制台上我看到了这些行:

INIT null
LIKE [commentableID]

不知何故,属性commentableIDinit()函数中不可用,但稍后在like()函数中。

如果你能解释一下上述两个问题,我将非常感激。

致以最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

我终于意识到我没有正确使用process属性。为了部分处理,在<p:commandButton>中,我需要处理的组件的ID以及@this 来处理按钮本身。此外,另一个问题是我没有使用process属性的正确语法。 ID应以comma而不是space分隔。以下代码段应该有效:

<p:commandButton process="@this, comment" actionListener="#{mrBean.postComment}" value="Post">
    <f:param name="id" value="#{viewCommentable.commentableID}" />
</p:commandButton>

<p:selectBooleanButton id="like" value="#{viewCommentable.commentable.liked}" onLabel="Liked" offLabel="Like" >
    <p:ajax process="like, dislike, commentableID" listener="#{mrBean.like(viewCommentable.commentable.liked)}" />
</p:selectBooleanButton>

答案 1 :(得分:0)

在p中添加进程和更新属性:commandButton喜欢这个,

     <h:panelGrid columns="1">
        <p:inputTextarea id="comment" value="#{mrBean.comment}" />

        <p:commandButton actionListener="#{mrBean.postComment}" value="Post" process="@this" update="grid">
          <f:param name="id"  value="#{viewCommentable.commentableID}" />
        </p:commandButton>
    </h:panelGrid>

但是,process属性有许多关键字,如@ this,@ form,@ all等。在here

中显示详细信息