2012-04-09 222 views
1

我一直在使用自定義控件的自定義屬性。有沒有自定義的方法?假設我想要在CC中發生某些事情。一個很好的例子是對話框擴展的顯示方法。如果我的cc裏面有一個擴展對話框,我希望我的自定義控件有一個Show方法,它將最終用戶程序員與擴展頁面Shoe方法隔離開來。自定義控件自定義方法?

有沒有辦法做到這一點?

回答

4

在運行時,所有自定義控件元素都成爲UIIncludeComposite類的實例;因此,您可以針對任何給定的控件實例調用許多內置方法,但無法指定自定義方法,而不是自定義屬性。

有,但是,你能達到的效果至少在兩個方面你是後:(this NotesIn9 episode介紹了最簡單的方法來此過程中)

  1. 將您的自定義控件的組件。一旦您將Designer生成的類遷移到每次構建NSF時都不會被覆蓋的類,您可以添加自定義方法,而不必擔心下一個構建會再次將其清除。由於自定義控件基本上只是IBM對「複合組件」的JSF 2.0概念的實現,所以您也可以從頭創建一個與現有自定義控件具有相同行爲的組件,但也支持自定義行爲。請注意,任何一種方法都不一定需要您創建OSGi庫......您可以直接在NSF中定義這些組件;如果您希望跨多個NSF重用它們,則只需將它們推送到庫中,而無需將各種文件複製到每個NSF中。

  2. 在您的控件的自定義屬性中,包含一個接受API對象的屬性。換句話說,您可以創建任何支持您希望定義的自定義方法的對象(例如Java類或SSJS對象),並將對象傳遞給控件。然後您可以通過CC的屬性圖獲取對象的句柄來調用這些方法。

例如:

<myCC id="myCustomControl" API="#{someObject}" /> 

假設任何#{someObject}解析爲包括show()方法,您可以通過獲取上已傳遞到該實例的句柄調用該方法控制:

var cc = getComponent("myCustomControl"); 
var ccProperties = cc.getPropertyMap(); 
var ccAPI = ccProperties.get("API"); 
ccAPI.show(cc); 

在上述例子中,我傳遞的實際自定義控制到顯示()方法,因爲對象本身是不知道自定義控制它被傳遞給的。因此,例如,如果該方法需要處理子項以切換其呈現的屬性,則需要其他方法來確定其上下文。

+0

我想我會重新發布我的問題,並以這種不同的方式。謝謝您的幫助。 – 2012-04-10 18:04:11

0

蒂姆的解決方案與傳遞對象是一個很好的解決方案。

只是彈出到我腦海中的東西,很容易使一個屬性類似於控件上的呈現屬性。傳遞一個值,並在自定義控件內部根據它的值做一些事情。如果真的顯示對話框,否則隱藏,在XPage運行期間修改該值並部分刷新控件,邏輯將由此重新運行,控件將顯示等。

0

另一個解決方案可能是在您的自定義控件中提供一個JavaScript庫,以提供必須傳遞自定義控件實例的ID的函數(您的自定義控件方法)。

+0

這很有趣。如何才能做到這一點?可以說我在x頁上有4次相同的CC。有沒有發言權在特定的CC上調用方法? – 2012-04-11 11:46:44