通过自定义控件的属性定义传递渲染功能

时间:2017-11-03 23:55:53

标签: java xpages xpages-ssjs

我已经构建了一个自定义控件,它通过重复控件呈现java对象的arraylist。通过属性定义,我可以提供我想要显示的底层java对象中的哪些字段。在后端我读了这个值,例如通过

obj[compositeData.columnField1]

这适用于静态数据,但有时我想格式化之前的渲染,例如当字段包含notesname,我只想显示commonname。

我想知道如何设置类似的东西。

现在我只传递字段名称,cc会将其读取以读取值。

E.g。对于jQuery DataTables插件,您可以为列定义渲染函数,并在该渲染函数中使用该列的数据变量(例如,在该列中构建锚链接或按钮)。

我可以为SSJS提供类似的东西,例如我将渲染函数作为文本(或对象?)传递,在后端将它转换为ssjs。

3 个答案:

答案 0 :(得分:0)

JavaScript中的函数是对象的一等公民。假设您创建了一个包含所有渲染函数的JS对象,并将其存储在其中一个作用域中。例如。 viewScope.renderFunctions。然后移交渲染函数的名称,并使用类似的内容:

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

应该做的伎俩

答案 1 :(得分:0)

我在stackoverflow上找到了答案。我的按钮的事件处理程序如下所示:

<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脚本库中的函数。这里的关键是不提供任何parantheses参数(!!!)

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中。数组列表通过我的重复控件中每一行的复选框组来设置。)

答案 2 :(得分: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>

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