我已经构建了一个自定义控件,它通过重复控件呈现java对象的arraylist。通过属性定义,我可以提供我想要显示的底层java对象中的哪些字段。在后端我读了这个值,例如通过
obj[compositeData.columnField1]
这适用于静态数据,但有时我想格式化之前的渲染,例如当字段包含notesname,我只想显示commonname。
我想知道如何设置类似的东西。
现在我只传递字段名称,cc会将其读取以读取值。
E.g。对于jQuery DataTables插件,您可以为列定义渲染函数,并在该渲染函数中使用该列的数据变量(例如,在该列中构建锚链接或按钮)。
我可以为SSJS提供类似的东西,例如我将渲染函数作为文本(或对象?)传递,在后端将它转换为ssjs。
答案 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
,在自定义控件中,您将知道所有内容是如何播放的,因为该类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>
或者您的代码可能是什么。无论如何,这就是它的要点。