将 Richfaces 意见箱迁移到 Primefaces 自动完成

Migrate Richfaces suggestionbox to Primefaces autocomplete

我们有以下问题。我们正在从 Richfaces 迁移到 Primefaces。以下是 Richfaces 实现的代码:

<h:panelGrid
  columns="3"
  cellspacing="0"
  cellpadding="0">
  <h:inputText
    id="inpID"
    converter="inpConverter"
    value="#{session.a}"
    valueChangeListener="#{session.sthChanged}"
    onfocus="someFunctionA();"
    onblur="someFunctionB();" />

  <h:commandLink
    action="#{session.redirectToSite()}"
    styleClass="targetButton align-middle" />

  <rich:suggestionbox
    id="inpSuggest"
    for="inpID"
    frequency="1"
    minChars="0"
    var="result"
    status="noStatus"
    fetchValue="#{result}"
    suggestionAction="#{manager.autocomplete}">
    <a4j:ajax
      event="select"
      listener="#{session.setSthAndRedirect(result)}"
      execute="@this" />
    <f:facet name="nothingLabel">
      <h:outputText value="No match found!" />
    </f:facet>
    <h:column>
      <h:outputText value="#{result.x}" />
    </h:column>
  </rich:suggestionbox>
</h:panelGrid>

到目前为止,我在 Primefaces 中有以下内容:

<h:panelGrid
  columns="3"
  cellspacing="0"
  cellpadding="0">
  <h:inputText
    id="inpID"
    converter="inpConverter"
    value="#{session.a}"
    valueChangeListener="#{session.sthChanged}"
    onfocus="someFunctionA();"
    onblur="someFunctionB();" />

  <h:commandLink
    action="#{session.redirectToSite()}"
    styleClass="targetButton align-middle" />

  <p:autoComplete
    id="inpSuggest"
    placeholder="#{session.a}"
    completeMethod="#{manager.autocomplete}"
    var="result"
    itemValue="#{result}"
    queryDelay="4000"
    emptyMessage="No match found!"
    converter="inpConverter">
    <p:ajax
      event="itemSelect"
      listener="#{session.setSthAndRedirect}" />
    <p:column>
      <h:outputText value="#{result.x}" />
    </p:column>
    <s:convertEntity />
  </p:autoComplete>
</h:panelGrid>

问题来了。 Richfaces 有一个很好的功能。将建议框嵌套到 h:inputText 中的属性 'for'。我怎样才能对 Primefaces 做同样的事情? 因为它们 onw 上的两个组件都有效(即,建议和重定向以及在 h:inputText 中输入内容并按回车键时同样有效)但我没有找到像在 Richfaces 中那样嵌套它们的方法。

当使用 Primefaces 的自动完成功能时,通过输入的输入进行的选择不起作用,例如: 用户在 1 秒内输入内容并想按回车键 --> 这是不可能的,也是我们想要实现的。

非常感谢任何帮助。

此致

我找到了解决方案(通过 JS 和 p:remoteCommand):

 <p:autoComplete
   [...]
   onkeyup="doSomething(event);"
   [...] >
   [...]
 </p:autoComplete>

<p:remoteCommand
   name="doRemote"
   immediate="true"
   actionListener="#{session.doIt}"
   style="display: none;" />

<script type="text/javascript">
  function doSomething(e) {
    var val = document.getElementById("someId");
    e = e || window.event;
    if(e.keyCode == 13) {
      doRemote([{name:'enteredValue', value:val.value}]);
      return false;
    } else {
      return true;
    }
  }
</script>