2012-06-06 38 views
1

我試圖做一個自定義的自動填充框,但我有一些麻煩。現在我有一個呼籲的keydown此功能jsf.ajax.request沒有完全工作

function pingAutoComplete(event) 
{ 
    console.log("pingAutoComlete Called"); 
    window.clearTimeout(window.keyTimeout); 


    //Wait 2 seconds before we attempt to pingAutoComplete incase user has not finished typing 
     window.keyTimeout = setTimeout(function() { 
     jsf.ajax.request(event, "keydown", {execute:'searchTerm',render:'autoCompletePanel'}) 
     autoCompleteLayoutPanel.show(); 
     return false; 
    }, 2000); 
    return false; 

} 

自動完成面板包含了一堆選擇看起來像這樣

<h:selectOneListbox id="vehicleResult" title="Vehicles" 
    value="#{searchBean.searchTerm}" 
    converter="entityConverter" 
    required="false" 
    rendered="#{!searchBean.filterAutoComplete().isEmpty()}"> 

    <f:selectItems value="#{searchBean.filterAutoComplete()}" 
     var="searchItem" itemValue="#{searchItem}" 
     itemLabel="#{searchItem.displayString}" 
     itemLabelEscaped="true" /> 
</h:selectOneListbox> 

的現在時的JavaScript調用它似乎被擊中的輸入searchBean.filterAutoComplete()在後端,但它實際上並沒有更新gui中的選擇列表。有人知道爲什麼

回答

1

您必須指定確切的客戶端ID。這是生成的HTML元素的id屬性的值,而不是JSF組件本身的值。如果JSF組件被放置在<h:form>中,那麼客戶端ID將默認預置其ID。

因此,以下panelGroup中

<h:form id="form"> 
    <h:panelGroup id="autoCompletePanel"> 

將具有form:autoCompletePanel客戶端ID。您需要在render屬性中準確指定該ID。順便說一下,同樣的規則也適用於execute

+0

對,我其實是這樣做的,但我試圖簡化它一點點的形式。它實際上是在後端,所以渲染似乎在找到自動完成面板。 – Landister

+0

儘量不要過分簡化未來的代碼,但要發佈真實的工作代碼。回到你的問題,具有客戶端ID'form:autoCompletePanel'的JSF組件本身**不**具有'rendered'屬性,對嗎? – BalusC

+0

對不起,我走了這麼久,見了會後見面。無論如何,我最終用一種名爲的primefaces comp來使它工作。 – Landister