2011-05-26 42 views
4

我正在構建一個頁面,該頁面將具有多個標記實例,如下所示。在ui中生成唯一的ID標記:include資源

<ui:include id="foo" src="images/something.svg" /> 

Faces Servlet將svg文件傳遞給瀏覽器,而不會進行除EL表達式之外的任何處理,這很好。問題在於包含文件中的id標籤是靜態的,因此包含該文件的多個標籤將生成非唯一的ID標籤。

我想要做的是一樣的東西是什麼H:形式確實,那裏的UI的ID:包括標籤前置到包含文件中的元素的ID。然後我可以毫不含糊地處理所有事情。

是否有一個公認的「最佳實踐」的方式來做到這一點?

更新:也許我應該擴大這個問題跟進,這是我需要做到這一點嗎?我的目標是在svg文檔的每個包含副本中唯一地標識標籤,其中可以有任何編號。無論如何,我有jQuery可用,因爲它由Primefaces引入。

所以,如果我有一個JSF文件是這樣的:

<ui:include id="foo" src="images/something.svg" /> 
<ui:include id="bar" src="images/something.svg" /> 

而且something.svg文件我有一個標籤

<rect id="blink" ... /> 

在頁面上的JavaScript裏面,我想能夠獲得指向foo:blinkbar:blink。我想我可以使用XPath表達式,但我知道這些很慢。我無法想象那些發明了UI的人:包括標籤沒有想過如何處理這個問題,所以我假設我錯過了一些明顯的東西。

+0

需要明確的是,在'something.svg'因此實際上* *一個一個facelet文件? – BalusC 2011-05-26 18:42:47

+0

不,這只是一個svg文檔,以(標題後)一個svg標籤開頭。在HTML 5中,這對於將動態和交互式文檔插入頁面非常有效,並且JSF在生成它時沒有問題。事情是Faces servlet不處理除UIComponents中的標記以外的任何ID標記,而svg文件中沒有任何標記是JSF定義的標記。 – AlanObject 2011-05-27 14:45:43

+0

但你提到它在處理EL表達式嗎?理論上可以引入JSF組件,甚至可以使它成爲一個已經獲得自動生成的ID的組合組件。 – BalusC 2011-05-27 14:48:37

回答

3

將其傳遞爲<ui:param>

<ui:include src="images/something.svg"> 
    <ui:param name="id" value="foo" /> 
</ui:include> 
<ui:include src="images/something.svg"> 
    <ui:param name="id" value="bar" /> 
</ui:include> 

您可以在包含文件的EL中使用參數名稱#{id}來引用它。例如。

<rect id="#{id}_blink" ... /> 
+1

我喜歡它。我不知道你可以這樣使用** ui:param **。這不是我理想的解決方案,因爲我試圖避免將東西放在svg源文件中,這會讓Inkscape等編輯器感到困惑。不過,我只是試了一下,Inkscape似乎並不介意在ID標籤中使用EL表達式。所以我會一起去,除非有更好的東西出現。我擔心我必須寫一個過濾器或其他東西。 – AlanObject 2011-05-27 15:32:37

+1

不客氣。順便說一句,謝謝你分享你的經驗,包括SVG文件與EL表達式就好了。我剛剛學到了一些新東西:) – BalusC 2011-05-27 15:34:35