2015-06-10 43 views
0

我想爲JSF複合組件的每個實例定義一個JavaScript函數。如何從JSF clientId生成唯一的JavaScript變量名稱?

對於這一點,在組件內部,我想是這樣的:

<h:outputScript> 
function myFunction_#{component.clientId}(day) { 
    //do my instance specific stuff 
} 
</h:outputScript> 

具體我想在RichFaces的日曆像這樣使用此功能:

<rich:calendar id="calendar" ... dayClassFunction="myFunction_#{component.clientId}"> 

但ClientID的不一定只包含在JavaScript變量名稱中有效的字符。

有沒有辦法在JSF EL表達式中計算md5哈希或類似於clientId(或其他東西)的僞唯一的東西?

我需要它特定於實例,因爲返回值依賴於實例值,而dayClassFunction屬性不接受將clientId本身或類似特定的參數作爲參數的函數。

+0

如果函數內部的this是爲創建的DOM節點,這將會相對簡單。 JSF中不是這種情況嗎? –

+0

確實如此!謝謝,我剛剛檢查過,它不是DOM節點,但仍然是特定於實例的JS對象,這非常有幫助 – user777

+0

您正在以錯誤的方式解決問題。乾淨的方式被問及並在這裏回答:http://stackoverflow.com/questions/12615556/integrate-javascript-in-jsf-composite-component-the-clean-way只需重用相同的功能,並提取複合組件特定的數據在那裏。 – BalusC

回答

2

我以前做過這樣的:

window['#{cc.clientId}'] = { 
    myFunction1 : function() { ... }, 
    myFunction2 : function() { ... } 
}; 

然後只需調用它,你與

dayClassFunction="window['#{cc.clientId}'].myFunction1()" 

需要這樣一切都可以被限制您的組件。最終,您可以向客戶端ID添加一些前綴,以避免與窗口範圍內的其他變量名稱發生衝突。

不能想到任何字符,這是允許在客戶端ID,這將打破JavaScript。

+0

哦,那很好!我沒有想到可以在JS中使用任意字符串的數組索引,謝謝好的技巧 – user777

1

假設它的分離器(:)這是你可以使用問題fn:replace

function myFunction_#{fn:replace(component.clientId, ':', '_')} 
+0

謝謝,這應該會產生非常獨特和有效的字符串! – user777

1

當調用你的函數,JSF將分配this是哪個JSF使用,以實現客戶端的特定實例的JS對象側。您可能能夠從中獲得所需的信息。