2017-11-03 120 views
2

我已經構建了一個自定義控件,通過重複控制呈現java對象的數組列表。通過屬性定義,我可以提供要顯示的底層java對象的哪些字段。在後端,我讀取了這個值,例如通過通過自定義控件的屬性定義傳遞渲染功能

obj[compositeData.columnField1] 

這適用於靜態數據,但有時我想格式化之前呈現例如當這個字段包含一個notesname並且我只想顯示這個commonname。

我想知道如何設置類似的東西。

現在我只傳遞字段名稱,它將被cc讀取以讀取值。

E.g.對於jQuery DataTables插件,您可以爲列定義渲染函數,並在該渲染函數內使用該列的數據變量(例如,在該列中構建錨點鏈接或按鈕)。

我可以爲SSJS提供類似的東西嗎?我將渲染函數作爲文本(或對象?)傳遞,並在後端將其轉換爲ssjs。

回答

0

JavaScript中的函數是對象上的第一類公民。假定您創建了一個包含所有渲染函數的JS對象並將其存儲在其中一個範圍中。例如。 viewScope.renderFunctions。然後交出渲染功能和內部使用類似名稱:

var renderfunc = viewScope.renderFunctions[funcname]; 
    var result = renderfunc(rawdata); 
     return result; 

這應該做的伎倆

+0

您也可以將函數本身交給對象類型的參數 – stwissel

0

我在這裏找到了答案上計算器。我的按鈕事件處理程序看起來如下:

<xp:eventHandler event="onclick" submit="true" 
      refreshMode="partial" refreshId="pnlContainer" 
      action="#{javascript:if (compositeData.actionButton.action) if (!compositeData.actionButton.action.call()) return;}"> 
     </xp:eventHandler> 

對於我的自定義控件我已成立了一個屬性:

<property> 
     <property-name>action</property-name> 
     <property-class>javax.faces.el.MethodBinding</property-class> 
     <property-extension> 
      <designer-extension> 
      <editor>com.ibm.workplace.designer.ide.xfaces.internal.editors.MethodBindingEditor</editor> 
      </designer-extension> 
     </property-extension> 
     <description>ssjs that action button must perform</description> 
     </property> 

確保類和編輯如上。

然後在包含自定義控制設置XPAGE的屬性包含SSJS:

action="#{javascript:removeSelected}" 

這是駐留在SSJS腳本庫的功能。這裏的關鍵是不提供括號的任何參數(!!!)

的SSJS功能如下:。

function removeSelected(){ 
    var accessList = sessionScope.get("removalList"); 
    var nsf_committee = datasources["COM1_DB_FILEPATH"];   
    var db:NotesDatabase = session.getDatabase(session.getServerName(), nsf_committee); 
    for (var i = 0; i < accessList.length; i++) { 
     var doc:NotesDocument = db.getDocumentByUNID(accessList[i]); 
     if (null != doc){ 
      doc.remove(true); 
      accessList.remove(accessList[i]); 
     } 
    } 
} 

(這裏我從數據庫中刪除文檔UNID ID的駐留在一個ArrayList列表通過複選框組設置爲我的重複控制中的每一行)

0

考慮到您可能想在應用程序的許多上下文中重新使用該組件,我會用一個輔助類和接口

public class FieldManager { 

    public static interface FieldDetail { 
    String getName(); 
    void getAction(); 
    } 

    private List<FieldDetail> fieldDetails = new List<FieldDetail>(); 

    public FieldManager() { 

    } 

    public FieldManager(List<FieldDetail> fieldDetails) { 
    this.fieldDetails.addAll(fieldDetails); 
    } 

    public void addFieldDetail(FieldDetail fieldDetail) { 
    this.fieldDetails.add(fieldDetail); 
    } 

    public List<FieldDetail> getFieldDetails() { 
    return fieldDetails; 
    } 

} 

有了這個簡潔的定義,您現在可以實現帶有泛型類或替代專用類的FieldDetail接口。

然後在自定義的控制,你設置屬性爲value也好,都在<property-class>標籤將FieldManager和自定義控制,你會知道一切如何發揮出來,因爲該類FieldManagerFieldDetail是你的合同。

<xp:repeat disableOutputTag="true" 
     value="#{compositeData.value.fieldDetails}" var="fieldDetail"> 
    <xp:link text="#{fieldDetail.name}"> 
     <xp:eventHandler event="onclick" submit="true" 
       refreshMode="partial" refreshId="pnlContainer" 
       action="#{fieldDetail.action}"> 
     </xp:eventHandler> 
    </xp:link> 
</xp:repeat> 

或者無論你的代碼可能是什麼。無論如何,這是它的要點。