如何推迟keyup ajax请求,直到达到h:inputText长度

Chr*_*phS 5 ajax jsf primefaces jsf-2.2

有没有办法推迟一个keyup ajax请求,直到啊:inputText值已达到定义的长度?

我想达到以下目标:textInput字段必须填充组合的日期和时间值.预期的格式是:ddMMHHmm

一旦值达到8个字符的长度,就必须将新的事件对象添加到数据列表中,并且应该立即显示以进行确认.要确认添加新事件,用户只需在此textInput字段中按Enter键即可.

我不知道是否有不同的功能,而不是使用ajax keyUp事件验证输入没有任何进一步的用户交互?

在这里,您可以看到我的想法的一个非常简短的例子:

@Named
@SessionScoped
public class EventController {

  private Date          selectedDate; // +getter/+setter
  private MyEvent       event;
  private List<MyEvent> events; // ArrayList<MyEvent>(), +getter

  @PostConstruct
  private void init() {
     // load current events from DAO
  }

  public void validateInput() {
    event = new MyEvent(selectedDate);
    events.add(event);
  }

  public void confirmEvent() {
    eventDAO.addEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

并且观点:

<h:inputText
  value="#{eventController.selectedDate}"
  converter="#{comfortableDateTimeInputConverter}"
  id="inputDateTime">
  <f:ajax
        <!-- pseudo code on  !!! -->
        executeCondition="<lengthOfInputField equals 8>" 
        <!-- pseudo code off !!! -->

        execute="inputDateTime"
        render="eventData"
        event="keyup"
        listener="#{eventController.validateInput}"
  />
</h:inputText>
<h:commandButton ... actionListener="#{eventController.confirmEvent}" />

<h:panelGroup id="eventData">
  <h:dataTable var="..." value="#{eventController.events}">
    // display event properties
  </h:dataTable>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

ComfortableDateTimeInputConverter提取输入字符串的时间部分的日期并返回日期对象.

我在用

  • 主要的5.2
  • mojarra 2.2.8

编辑1

正如BalusC所建议我修改了我h:inputText,但似乎没有任何事情发生.这是我的原始代码exept控制器名称.我在里面添加了一条日志消息eventController.validateNewEvent,但似乎没有执行.我错过了什么?

<h:inputText
  readonly="#{empty eventController.selectedPerson}"
  value="#{eventController.selectedDate}"
  id="inputDateTime"
  tabindex="3"
  converter="#{comfortableDateTimeInputConverter}"
  onkeyup="return value.length >= 8"
  onfocus="this.select()">
  <f:ajax
        event="keyup"
        execute="inputDateTime"
        listener="#{eventController.validateNewEvent}"
        render="selectedDate txtDate listEvents" />
  </h:inputText>
Run Code Online (Sandbox Code Playgroud)

我也尝试render="@all"了ajax元素,但仍然没有任何反应.如果我使用event="blur"并使用TAB保留输入,它就像一个魅力......

编辑2(已解决)

更换

onkeyup="return value.length >= 8"
Run Code Online (Sandbox Code Playgroud)

onkeyup="return this.value.length >= 8"
Run Code Online (Sandbox Code Playgroud)

它的工作原理.查看BalusC的回答......

Bal*_*usC 8

只需return falseonkeyup只要value.length还没有达到期望值.

例如

<h:inputText ... onkeyup="return this.value.length >= 8">
    <f:ajax event="keyup" ... />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)