2015-04-24 19 views
4

好吧,這是一個奇怪的。如何使用XPages Java代碼在自定義控件中設置有效的輸入控件方法?

在XPages中,我的dataSource是一個Java對象。託管bean或PageController。我通過分機使用bootstrap。圖書館。

我想要做的就是將所有驗證代碼保存在Java對象中,而不是附加任何東西到XPage上的控件。在java對象內部,我可以通過以下方式添加任何錯誤消息: FacesContext.getCurrentInstance()。addMessage

因此,任何錯誤都可以通過控件顯示。

但我不知道該怎麼做是針對一個單獨的控制,如果我想發送消息到一個特定的(單數)控制。

現實我很樂意能是用這個例子的引導現場自定義控件:http://www.bootstrap4xpages.com/bs4xp/demos.nsf/reusableFields.xsp

和設置的isValid方法我的Java類,以便引導場通過已─呈現紅色錯誤樣式。

有關如何到自定義控件內的輸入控件的isValid或甚至讓我通過java驗證但控制字段樣式的替代方法的任何建議,將不勝感激。

謝謝

回答

2

我所做的是使用組件的自定義驗證程序。例如,

<xp:this.validators> 
    <xp:customValidator validate="#{javascript:controller.validateDuration(this)}"></xp:customValidator> 
</xp:this.validators> 

以我的控制器類:

public void validateDuration(UIComponent source) { 
    // Do my checks... 
    // If fails, 
    BeanUtils.setControlInvalid(source, "Format Error at date time!"); 
} 

BeanUtils的方法無效的特定組分和產生一個驗證錯誤消息:

public static void setControlInvalid(UIComponent editableComponent, String message) { 
    if(StringUtil.isEmpty(message) || editableComponent==null) return; 

    if(editableComponent instanceof EditableValueHolder) { 
     ((EditableValueHolder) editableComponent).setValid(false); 
     postFacesMessage(editableComponent, FacesMessage.SEVERITY_ERROR, message); 
    } 

} 

public static void postFacesMessage(UIComponent component, Severity severity, String msg) { 
    if(StringUtil.isEmpty(msg) || component==null) return; 

    FacesContext fc=FacesContext.getCurrentInstance(); 

    FacesMessage message=new FacesMessage(severity, msg, msg); 
    fc.addMessage(component.getClientId(fc), message); 
} 
+0

謝謝Serdar。我正在消化這個。我並不確定如何將這個與編輯控件一起用於自定義控件中。我想我必須以某種方式計算ID,但我不確定。我確實認爲我可能有一個現在正在嘗試的替代方法。 –

1

不限UIComponent具有一個setValid(boolean)方法。所有控件還具有binding屬性,該屬性可用於將該組件綁定到Java對象,例如,你的bean中的一個屬性。

但是,如果您的自定義控件被多次使用,則無法使用該控件,因爲所有實例都將試圖綁定到相同的bean屬性。

但是,有一些狡猾的想法,有可能利用相同的概念。如果你的bean有一個Map<String, Component> myCunningBindings,您可以添加動態地使用此代碼的加載屬性綁定的集合:

<this.loaded><![CDATA[${javascript:myBean.getMyCunningBindings().put(compositeData.fieldMapping, this); 
return "";}]]> 
</xp:this.loaded> 

因此,代碼的第一行得到的地圖,並增加了一個元素。該元素有一個值(組件本身)和一個標籤。對於標籤,我們獲得了您也可能通過compositeData傳入的字段映射。最後,我們迴歸真實。

驗證過的bean應該知道它保存在哪裏,所以你應該能夠計算傳入compositeData的字段映射,這將是你在Map中查找的關鍵。並從那裏,你有組件調用setValid(false)。

+0

傑西加拉格在我之前到達那裏https://frostillic.us/blog/posts/073D97410CE1F89785257D0B00773F4A –

+0

謝謝保羅和傑西。很有意思。我也在消化這一點。雖然我開始懷疑我是否真的需要這個組件,如果沒有它,我們不能得到相同的結果。 –

相關問題