由于目前没有更好的答案,我会在这里发布一个。
实际上,<xp:fileDownload> 组件列出文件附件的顺序是它们出现在文档的富文本字段中,而不是最新的最后一个:
您无法使用任何属性更改此行为,因此一种可能的方法是获取附件列表,按照您的需要对其进行排序,然后将排序后的列表提供给<xp:repeat> 组件,您可以在其中绘制与<xp:fileDownload> 显示的内容略有不同甚至没有差异的附件表。这并不难,只需在浏览器调试工具中查看创建的 HTML 标记,然后在 <xp:repeat> 中重新创建即可。
假设您在页面上声明了dominoData:
<xp:this.data>
<xp:dominoDocument var="document1"
documentId="9CAA72D47AEA7C8D462582FB005AB525"
action="openDocument" />
</xp:this.data>
然后创建您的<xp:repeat> 所在的<xp:panel>。为您的面板创建dataContext:
<xp:panel>
<xp:this.dataContexts>
<xp:dataContext var="attachments">
<xp:this.value><![CDATA[
#{javascript:
var sourceList:java.util.List = document1.getAttachmentList('files');
if (sourceList.size() == 0) {
return sourceList;
}
java.util.Collections.sort(sourceList, createdComparator);
return sourceList;
}
]]></xp:this.value>
</xp:dataContext>
</xp:this.dataContexts>
</xp:panel>
您会在此处获得com.ibm.xsp.model.domino.wrapped.DominoDocument.AttachmentValueHolder 对象的列表,然后使用created 文件属性使用声明的比较器(请参阅下面的更新)对列表进行排序,并将排序后的列表作为attachments 变量返回。
然后创建<xp:repeat> 并将其嵌套在<xp:panel> 中<xp:dataContexts> 之后。将dataContext 的变量名作为value 给它:
<xp:repeat value="#{attachments}" var="attachment">
<xp:text value="#{attachment.type}" />
<xp:label value=" - " />
<xp:text>
<xp:this.value><![CDATA[
#{javascript:
var rawSize = attachment.getLength();
return (rawSize < 1024 ? 1 : (rawSize / 1024).toFixed(0)) + " KB";
}
]]></xp:this.value>
</xp:text>
<xp:label value = " - " />
<xp:link text="#{attachment.name}" value="#{attachment.href}" />
<xp:label value = " - " />
<xp:text>
<xp:this.value>
#{javascript:
return new java.util.Date(attachment.getCreated());
}
</xp:this.value>
<xp:this.converter>
<xp:convertDateTime type="both" timeStyle="short" />
</xp:this.converter>
</xp:text>
<xp:br />
</xp:repeat>
这是<xp:repeat> 输出与<xp:fileDownload> 相比的结果:
只需创建类似于fileDownload 的表的标记,就完成了。
更新
值得努力创建一个请求范围的托管 Bean,它将充当比较器,而不是在 SSJS 代码块中实现一些好的排序算法。
在某个现有或新包下的 Code/Java 文件夹中创建一个 Java 类。如果包名称是例如com.benway.util,类名是CreatedComparator:
package com.benway.util;
import java.util.Comparator;
import com.ibm.xsp.model.FileRowData;
public class CreatedComparator implements Comparator<FileRowData> {
public int compare(FileRowData file1, FileRowData file2) {
if (file1 == null || file2 == null) return 0;
return (int)(file2.getCreated() - file1.getCreated());
}
}
在faces-config.xml 中将您的新类注册为托管 bean:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
<managed-bean>
<managed-bean-name>createdComparator</managed-bean-name>
<managed-bean-class>
com.benway.util.CreatedComparator
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
...etc...
</faces-config>
现在你真的完成了:)