2017-11-03 119 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> 

或者无论你的代码可能是什么。无论如何,这是它的要点。