簡體   English   中英

JSTL,復合,NamingContainer和prependId

[英]JSTL, composite, NamingContainer and prependId

我已經編寫了一個復合組件,並想使用保留的EL #{component.clientId}進行JQuery綁定。 要在頁面的另一個位置(組件外部)使用此檢索到的clientId,我使用JSTL將其存儲在視圖范圍變量中。 奇怪的是,JSTL似乎阻止了將其id附加在其子代之前的自然復合組件行為( NamingContainer行為)。 我知道JSTL有點棘手,由於生命周期的原因,它會干擾其他組件(例如ui:repeat ),但是在這里我不了解這種行為。

一些具體的代碼比這個冗長的演講更好:

<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:rich="http://richfaces.org/rich"
        xmlns:c="http://java.sun.com/jsp/jstl/core"    
        xmlns:composite="http://java.sun.com/jsf/composite">
    <composite:interface>
        […]
    </composite:interface>
    <composite:implementation>
        <rich:dataTable id="mySoLovedDataTable" […]>
            #{component.clientId}
            <!-- Commenting or uncommenting this line make the whole point -->
            <c:set var="targetClientId" value="#{component.clientId}" scope="view" />
            […]
        </rich:dataTable>
    </composite:implementation>
</html>

注釋掉該行后, #{component.clientId}給出類似於j_idt261:mySoLovedDataTable

注釋掉該行后,僅給出mySoLovedDataTable

JSTL在視圖構建期間運行。 它在JSF將視圖模板解析成一個完全有價值且可渲染的JSF組件樹時運行。 JSF在視圖渲染期間運行。 它在JSF將組件樹編碼為一堆HTML的點上運行。 您可以將其可視化如下:JSTL從上到下先運行,並且僅使用JSF標記產生結果。 然后,在JSF渲染響應階段,JSF將自上而下運行並產生HTML結果。

換句話說,JSTL和JSF不會像您期望的那樣同步運行。 通常,您想使用Facelets的<ui:param>而不是JSTL <c:set>

<ui:param name="targetClientId" value="#{component.clientId}" />

請注意,這實際上並沒有在任何范圍內設置任何內容。 它只是為給定的表達式創建一種“別名”。 我不確定它是否可以按您希望的方式在您的特定情況下工作,但是據我了解的功能要求,您希望能夠在視圖中進一步獲取客戶端ID <rich:dataTable>之后組件。 在這種情況下,最好使用binding

<rich:dataTable binding="#{table}" ...>
    ...
</rich:dataTable>

<script>
    var $table = jQuery("[id='#{table.clientId}']");
    // ...
</script>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM