0

我有以下问题:

这是我的 xhtml 部分。

 <h:panelGroup id="#{id}suggestionPanel" rendered="#{rendered}">
     <a4j:jsFunction name="autocompleteHandler"
            action="#{autocompleteBean.prepareAction(suggestionAction)}">
         <a4j:actionparam name="param1" assignTo="#{searchString}"/>
     </a4j:jsFunction>
 ...
 <h:inputText value="#{searchString}"
              rendered="#{validationId == null}"
              id="#{id}search"
              onkeyup="delayedHandler(300, this)"/>

此处给出了处理此问题的 javascript 方法:

var _timer = 0;
function delayedHandler(ms, thisElement)
{
    if (_timer) window.clearTimeout(_timer);
    _timer = window.setTimeout(function()
    {
        autocompleteHanlder(thisElement.value)
    }, ms);
}

那么我有什么问题呢?

执行此代码时出现此错误:

Uncaught TypeError: Cannot read property 'action' of null framework.pack.js.xhtml:2791
A4J.Query framework.pack.js.xhtml:2791
A4J.AJAX.PrepareQuery framework.pack.js.xhtml:2562
A4J.AJAX.Submit framework.pack.js.xhtml:2592
autocompleteHandler

很酷的事情是,如果我的 javascript 没有像这样以延迟方式调用处理程序

function delayedHandler(ms, thisElement)
{            
    autocompleteHanlder(thisElement.value);            
}

javascript 函数的延迟部分没有问题,因为我已经用一些警报对其进行了测试。

不知何故,由于这种延迟,它无法读取<a4j:jsFunction.

任何人都知道如何解决这个问题?

4

1 回答 1

2

我实际上解决了这个问题。您不需要任何 JavaScript 调用来延迟执行。a4j:jsfunction 有一个名为“requestDelay”的属性,可以处理所有需要的超时。所以基本上代码看起来像

<a4j:jsFunction name="autocompleteHandler"
                action="#{suggestionTestBean.prepareAction(suggestionAction)}"
                requestDelay="1200">
</a4j:jsFunction>

延迟 1.2 秒,然后你会这样调用你的延迟执行:

<h:inputText value="#{searchString}"
             rendered="#{validationId == null}"
             id="#{id}search"
             onkeyup="autocompleteHandler()"/>
于 2012-12-25T13:58:45.140 回答