2

在我的应用程序中,我有这个托管 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]。换句话说,postComment()即使正确创建了 bean,也从未调用过侦听器方法。

问题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]

不知何故,该属性在函数commentableID中不可用,init()但后来在函数中可用like()

如果您能给我解释上述两个问题,我将不胜感激。

最好的祝福,

4

2 回答 2

1

我终于意识到我没有process正确使用该属性。为了部分处理,在 a 中<p:commandButton>,我需要我想要处理的组件的 id以及 a@this来处理按钮本身。此外,另一个问题是我没有使用正确的process属性语法。id 应该由 acomma而不是 a分隔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>
于 2013-03-30T06:38:36.710 回答
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>

但流程属性有很多关键字,如@this、@form、@all 等。在此处显示详细信息

于 2012-06-05T11:21:21.233 回答