通过自定义控件的属性定义传递渲染功能
我已经构建了一个自定义控件,通过重复控制呈现java对象的数组列表。通过属性定义,我可以提供要显示的底层java对象的哪些字段。在后端,我读取了这个值,例如通过通过自定义控件的属性定义传递渲染功能
obj[compositeData.columnField1]
这适用于静态数据,但有时我想格式化之前呈现例如当这个字段包含一个notesname并且我只想显示这个commonname。
我想知道如何设置类似的东西。
现在我只传递字段名称,它将被cc读取以读取值。
E.g.对于jQuery DataTables插件,您可以为列定义渲染函数,并在该渲染函数内使用该列的数据变量(例如,在该列中构建锚点链接或按钮)。
我可以为SSJS提供类似的东西吗?我将渲染函数作为文本(或对象?)传递,并在后端将其转换为ssjs。
JavaScript中的函数是对象上的第一类公民。假定您创建了一个包含所有渲染函数的JS对象并将其存储在其中一个范围中。例如。 viewScope.renderFunctions
。然后交出渲染功能和内部使用类似名称:
var renderfunc = viewScope.renderFunctions[funcname];
var result = renderfunc(rawdata);
return result;
这应该做的伎俩
我在这里找到了答案上计算器。我的按钮事件处理程序看起来如下:
<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列表通过复选框组设置为我的重复控制中的每一行)
考虑到您可能想在应用程序的许多上下文中重新使用该组件,我会用一个辅助类和接口
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
和自定义控制,你会知道一切如何发挥出来,因为该类FieldManager
和FieldDetail
是你的合同。
<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>
或者无论你的代码可能是什么。无论如何,这是它的要点。
您也可以将函数本身交给对象类型的参数 – stwissel