如何在p:inputText中按下enter时调用方法

时间:2017-05-12 14:14:32

标签: jsf primefaces

我有一个JSF ajax keydown事件链接到支持bean中的事件监听器。

JSF文件中的代码如下所示。

<p:inputText value="#{someBean.value}>
<p:ajax event="keydown" listener="#{someBean.keyDownEvent}" />
</p:inputText>

我想得到&#34;输入&#34;按钮事件代码。当我点击回车时,我需要在服务器端执行一些特定的事件。如何使用ajax调用获取该事件代码?

3 个答案:

答案 0 :(得分:4)

由于您只想在按下 Enter 键时执行操作,我真的不会使用Ajax调用将每个键发送到后端,并确定按下了哪个键。

只需检查前端的输入,如果检测到,那么使用p:remoteCommand调用后端。但这里有一个问题。输入woud默认提交整个表单,因此请确保在找到false for enter(13)时返回keyCode

然后,validation。如果您的表单中碰巧有多个输入,则可能会遇到验证错误。因此,将远程命令设置为仅处理自身以及按下回车键的输入。 (可选)您可能希望更新链接到输入的p:message字段以显示任何验证错误。

这将导致:

<p:remoteCommand name="myRemCo"
                 action="#{someBean.action}"
                 process="@this myInput"
                 update="myInputMessage"/>

<p:inputText id="myInput"
             value="#{someBean.value}"
             onkeydown="if (event.keyCode === 13) { myRemCo(); return false; }"
             required="true"/>
<p:message for="myInput" id="myInputMessage"/>

请注意,我将required="true"放在那里以演示更新邮件,以防您在输入仍为空时按Enter键。

另见:

答案 1 :(得分:0)

如果您需要按下的键的代码,那么这是一个例子。它为inText输入控件分配一个事件处理程序。这里从事件对象获取按下的键的代码,并通过onKeyPressed调用控制器的<p:remoteCommand>方法。密钥代码作为请求参数传递。密钥代码显示在outText输出控件中作为测​​试。

小脸:

<?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://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
  <h:head>
    <title>Facelet Title</title>
      <script type="text/javascript">
        function jsKeyPressedHandler(event)
        {
          var kc = event.which || event.keyCode;
          rc( [{ name : 'keyCode', value : Number( kc ) }] );
        }
      </script>

</h:head>
  <h:body>
    <h:form id="myForm">
    <p:remoteCommand name="rc" update="outText" actionListener="#{myBean.onKeyPressed}" />
    <p:inputText id="inText" value="#{myBean.text1}" onkeypress="jsKeyPressedHandler( event )"/>
    <h:outputText id="outText" value="#{myBean.text2}"/>
    </h:form>
  </h:body>

  </h:body>
</html>

控制器:

package x;

import java.io.Serializable;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named( value = "myBean" )
@ViewScoped
public class MyBean implements Serializable
{
  private String text1;
  private String text2;

  public String getText1() { return text1; }      
  public void setText1( String text1_ ) { text1 = text1_; }      
  public String getText2() { return text2; }      
  public void setText2( String text2_ ) { text2 = text2_; }      

  public void onKeyPressed()
  {
    Map<String,String> reqParams = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
    String c = (String) reqParams.get( "keyCode" );
    if ( text2 != null )
      text2 += c;
    else
      text2 = c;  
  }
}

答案 2 :(得分:0)

您可以使用primefaces的默认命令组件。检查出来