2013-07-01 54 views
0

我一直在试图将一个队列放到文本区域,并且它不合作。我将在下面列出相关的代码部分。Richfaces 4 Ajax:队列inputTextArea不排队

<h:form> 
    <a4j:queue requestDelay="1000" ignoreDupResponses="true"/> 
    <table> 
     <tr> 
      <td> 
       <h:outputText value="Notes:"/> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <h:inputTextarea value="#{MyActionBean.notes}"> 
        <a4j:ajax event="keyup" listener="#{MyActionBean.updateNotes}"/> 
       </h:inputTextarea> 

笔记按预期更新,但请求之间没有延迟。我的代码中是否存在一些错误,textAreas不适用于此?任何帮助,将不胜感激。

编辑:只是为了好的措施,也尝试了下面的代码,但它也没有工作。

<h:panelGrid columns="1" width="100%"> 
    <h:outputText value="Notes:"/> 
    <h:inputTextarea value="#{MyActionBean.notes}"> 
     <a4j:ajax event="keyup" listener="#{MyActionBean.updateNotes}"> 
      <a4j:attachQueue id="notesQueue" requestDelay="1000"/> 
     </a4j:ajax> 
    </h:inputTextArea> 
</h:panelGrid> 

以供参考,该技术的版本: JBoss应用服务器7时,Seam 2.3.0,4.2.2 RichFaces的,JSF 2.1

+0

检查更新,让我知道 – Andy

回答

0

对于你的情况,你需要嵌套a4j:attachQueuea4j。尝试运行下面的代码,您会注意到您将在15秒后在控制台上获得输出。

<h:head> 
    <title>Facelet Title</title> 
</h:head> 
<h:body> 
    <h:form> 
     <a4j:queue name='Y' requestDelay="3000" ignoreDupResponses="true"/> 
     <h:panelGrid columns="1" width="100%"> 
      <h:outputText value="Notes:"/> 
      <h:inputTextarea value="#{MyActionBean.notes}"> 
       <a4j:ajax event="keyup" listener="#{MyActionBean.updateNotes}"> 
        <a4j:attachQueue requestDelay="3000"/> 
       </a4j:ajax>    
      </h:inputTextarea> 
      <a4j:status> 
       <f:facet name="start"> 
        Please wait 
       </f:facet> 
      </a4j:status> 
     </h:panelGrid> 
    </h:form> 
</h:body> 

您可以使用此link if you need more information

UPDATE

我剥了下来,你发送到最低限度的代码,我很抱歉地说,它仍然工作在我结束与JBoss的。您的问题可能在其他地方(例如,由于您告诉我“Please Wait”未出现,您的ajax可能因某种原因失败)。但是,我应该提到我对JBoss的对话范围并不熟悉,因此我将其更改为javax.enterprise.context.SessionScoped(但我认为这不重要,因为它在请求范围内仍然有效)。我包含了所有的代码,所以你可以自己测试它作为一个单独的项目。另外,由于我们正在使用队列,因此我将日志记录位置从updateNotes更改为setReport,以便我可以绝对确定这些字符实际上正在排队。当我输入“这是一个测试”时,我看到的唯一输出是整个字符串,而不是每个字符。

AssessmentCheckListAction.java

import java.io.Serializable; 
import javax.faces.context.FacesContext; 
import javax.inject.Named; 
import javax.enterprise.context.SessionScoped; 

@Named(value="AssessmentChecklistAction") 
@SessionScoped 
public class AssessmentCheckListAction implements Serializable { 

    private static final long serialVersionUID = -4970638494437413924L; 
    private String report; 

    public AssessmentCheckListAction() { 
    } 

    public void updateNotes() { 
     //FacesContext.getCurrentInstance().getExternalContext().log(report); 
     //Logging the setter to make sure everything was queued 
    } 

    public String getReport() { 
     return report; 
    } 

    public void setReport(String report) { 
     FacesContext.getCurrentInstance().getExternalContext().log(report); 
     this.report = report; 
     //left blank 
    } 

的index.xhtml

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html"> 
    <h:head> 
     <title>Facelet Title</title> 
    </h:head> 
    <h:body> 
     <ui:composition xmlns="http://www.w3.org/1999/xhtml" 
         xmlns:ui="http://java.sun.com/jsf/facelets" 
         xmlns:f="http://java.sun.com/jsf/core"      
         xmlns:h="http://java.sun.com/jsf/html"     
         xmlns:a4j="http://richfaces.org/a4j" 
         template="template.xhtml"> 
      <ui:define name="content"> 
       <h:form> 
        <a4j:queue requestDelay="3000" ignoreDupResponses="true"/> 
        <h:panelGrid columns="1" width="100%"> 
         <h:outputText value="Notes:"/> 
         <h:inputTextarea value="#{AssessmentChecklistAction.report}"> 
          <a4j:ajax event="keyup" listener="#{AssessmentChecklistAction.updateNotes}"> 
           <a4j:attachQueue requestDelay="3000"/> 
          </a4j:ajax>    
         </h:inputTextarea> 
         <a4j:status> 
          <f:facet name="start"> 
           Please wait 
          </f:facet> 
         </a4j:status> 
        </h:panelGrid> 
       </h:form> 
      </ui:define> 
     </ui:composition> 
    </h:body> 
</html> 

的template.xhtml

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
     <meta http-equiv="Cache-Control" content="no-store"/> 
     <meta http-equiv="Pragma" content="no-cache"/> 
     <meta http-equiv="Expires" content="0"/>    
    </h:head> 

    <h:body> 
     <ui:insert name="content"/> 
    </h:body> 
</html> 
+0

我试过实现这个,但它仍然发送每个请求到服务器。我在你的例子和我的代码之间看到的差异是我的包裹在一个中,并且这个应用程序构建在Seam上,所以它使用Name注释而不是ManagedBean注释。 (因为这应该是一个客户端行为,我不认为这是问题) – drandall

+0

对不起,慢回复。我认为我们处于同一页面,通过在表单元素中添加ajax,我们要求客户端对请求进行排队,而不是立即发送请求。我添加了但是,当我记录更新注释方法时,它仍在发送每个字符。Firebug还显示每个字符的请求 – drandall

+0

我试着运行您提供的示例代码,但导致了相同的行为。这个动作bean正在使用对话范围。 UI:构图正在包含在布局中。基本结构(减去所有额外)布局中没有任何表单,它按预期方式提交表单数据,因此没有嵌套表单。 – drandall