奇怪的错误:inputTextarea只将其值挂钩到dataTable的最后一行

时间:2010-10-15 20:18:00

标签: java jsf jsf-2

错误是我在下面的inputTextarea。只有最后一行可以记录来自inputTextarea的任何输入,换句话说,只记录最后一行,将其value挂钩到#{PostComment.comment.comment}。这是为什么?

<h:form id="userCommentList" >
   <p:dataTable value="#{CentralFeed.profileComments}" var="item">
        <p:column>        
           <!-- Original Comment -->         
           <h:outputText value="#{item.comment}"/> &nbsp;              

           <!-- ****BUG IS THIS INPUTTEXTAREA BELOW*** -->
           <h:inputTextarea id="keyword" value="#{PostComment.comment.comment}"/> &nbsp;

           <p:commandButton actionListener="#{PostComment.postProfileComment(item.id)}"
                                             value="Post" update="userCommentList" />
        </p:column>                                                                                   
   </p:dataTable>
</h:form>

修改 我改变了inputTextareacommandButton,就像你建议的BalusC一样。我在Comment实体内添加了另一个字段调用newComment,因此Comment看起来像这样

Comment
+ id
+ comment
+ newComment --> I have @Transient to this field so it wont map to the database. I also set its default value to the empty string in the constructor
+ ...

...
<p:column>
    ...
    <h:inputTextarea id="keyword" value="#{item.newComment}" rows="2" />
    <p:commandButton actionListener="#{PostComment.postReply(item)}" value="Post" />
</p:column>

我希望item.newComment能保留我输入的值,所以当我将对象item传递给postReply时,我可以提取newComment的内容,但它是空字符串。所以我输入的内容都不会绑定到newComment。知道为什么吗?

1 个答案:

答案 0 :(得分:2)

您实质上是将表中多个textareas的值绑定到同一个 bean属性。在请求处理期间,JSF将使用表中的 all textareas值更新此属性,每次都覆盖前一个,直到最后一行中的那个为止。这就是为什么你只能在最后一行看到一个值。

您需要将textarea值绑定到行对象,在您的情况下为#{item}。 E.g。

<h:inputTextarea id="keyword" value="#{item.newComment}"/>