0

我有一个这样的jsf代码。当用户输入完姓名和评论并按“Enter”后,内容会显示在“Content........”这部分。

<h:form id="all_comments">
    Content........
</h:form>
<h:form id="submit_comment">
    <h:inputText id="name_box" value="#{ManagedBean.user}"/>
    <h:inputText id="content_box" value="#{ManagedBean.comment}" />
</h:form>

我想用ajax完成它,我尝试这样:

<h:form id="all_comments">
    Content........
</h:form>
<h:form id="submit_comment">
    <h:inputText id="name_box" value="#{ManagedBean.user}"/>
    <h:inputText id="content_box" value="#{ManagedBean.content}">
        <f:ajax event="keydown"
                listener="#{ManagedBean.addComment}"
                execute="comment_name_box comment_content_box"
                rendered=":all_comments" />
    </h:inputText>
</h:form>

但是我失败了,我能否实现当用户按下“Enter”时,数据将由 ManagedBean 处理,然后使用 ajax 更新页面。

4

1 回答 1

2

您缺少一些要点:

  1. 仅当按下回车键时才需要发送 AJAX 调用,因此需要将<h:inputText>标签的onkeydown属性与 JavaScript 代码绑定;
  2. <f:ajax>属性是render,不是rendered
  3. submit_comment表单也应该重新呈现,以便将新数据呈现给用户,并且占位符也必须在 AJAX 侦听器中刷新。

当您想在该事件上提交第二个表单时,这是解决方案:

<h:form id="all_comments">
    Content........
</h:form>
<h:form id="submit_comment">
    <h:inputText id="name_box" value="#{managedBean.user}"/>
    <h:inputText id="content_box" value="#{managedBean.content}"
                 onkeydown="return (event.keyCode == 13);">
        <f:ajax event="keydown"
                listener="#{managedBean.addComment}"
                execute="@form"
                render="@form :all_comments" />
    </h:inputText>
</h:form>

public void addComment(AjaxBehaviorEvent abe) {
    comments.add(new Comment(user, content));
    user = "";
    content = "";
}
于 2013-05-21T14:37:07.313 回答