[英]Should a composite component really require namingcontainer interface?
[英]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.