Xpages 从repeat控件外部获取repeat控件内的面板内文档的句柄
我正在开发此功能,其中我需要向用户提供一个文档列表,并为用户提供一个选项来更改/添加这些文档中的字段值。我正在研究这个例子,并做了一个类似的实现,使它能够工作。因此,我现在在repeat中有一个面板,它的数据源设置为form,文档id设置为返回repeat控制变量中的值(它是文档集合中的文档UNID),因此我可以使用面板中定义的数据源将字段直接绑定到这些文档。挑战在于,我希望获得这些文档的句柄,以便在其中设置特定值,并将值保存在绑定到后端文档的字段中。是否有任何方法可以从重复控制之外访问文档(比如单击按钮)?以下是我的重复代码:Xpages 从repeat控件外部获取repeat控件内的面板内文档的句柄,xpages,document,repeat,Xpages,Document,Repeat,我正在开发此功能,其中我需要向用户提供一个文档列表,并为用户提供一个选项来更改/添加这些文档中的字段值。我正在研究这个例子,并做了一个类似的实现,使它能够工作。因此,我现在在repeat中有一个面板,它的数据源设置为form,文档id设置为返回repeat控制变量中的值(它是文档集合中的文档UNID),因此我可以使用面板中定义的数据源将字段直接绑定到这些文档。挑战在于,我希望获得这些文档的句柄,以便在其中设置特定值,并将值保存在绑定到后端文档的字段中。是否有任何方法可以从重复控制之外访问文档(比
<xp:repeat id="rptApprDocuments" rows="30" var="apprDoc"
indexVar="docIndex" first="0">
<xp:this.value><![CDATA[#{javascript:// Look up the employee details view to get the employee appraisal details from the current database
var curDB:NotesDatabase = session.getCurrentDatabase();
var vwlkApprView:NotesView = curDB.getView("vwlkApprAllFGCompAppr");
var collDocAppr:NotesDocumentCollection = vwlkApprView.getAllDocumentsByKey(sessionScope.key);
var apprDocCount = collDocAppr.getCount();
if(apprDocCount != 0){
var docAppr:NotesDocument;
var docUNIDArray = new Array();
for(i=0;i<apprDocCount;i++){
docAppr = collDocAppr.getNthDocument(i+1);
//print(docAppr.getUniversalID());
docUNIDArray.push(docAppr.getUniversalID());
}
viewScope.put("docUNIDArray",docUNIDArray);
return docUNIDArray;
/*return collDocAppr;
/return sortColByItemName(collDocAppr, "AppraiseeCWLCluster");*/
}
return null;
]]></xp:this.value>
<xp:panel id="pnlRR">
<xp:this.data>
<xp:dominoDocument formName="frmAppraisal" var="appraisalDoc"
action="editDocument" ignoreRequestParams="true">
<xp:this.postSaveDocument><![CDATA[#{javascript:if(requestScope.SubmitRR == true){
appraisalDoc.setValue("ApperRRStatus","1");
appraisalDoc.save();
}}]]></xp:this.postSaveDocument>
<xp:this.documentId><![CDATA[#{javascript://apprDoc.getUniversalID();
return apprDoc;}]]></xp:this.documentId>
</xp:dominoDocument>
</xp:this.data>
<xp:tr>
<xp:td styleClass="tdCls" style="width:2%">
<xp:label id="SrNo">
<xp:this.value><![CDATA[#{javascript:var index = parseInt(docIndex)
index = index + 1;
index.toString();}]]></xp:this.value>
</xp:label>
</xp:td>
<xp:td styleClass="tdCls" style="width:20.0%">
<xp:label id="ApeName">
<xp:this.value><![CDATA[#{javascript://return apprDoc.getItemValueString("AppraiseeName");
return appraisalDoc.getItemValueString("AppraiseeName");}]]></xp:this.value>
</xp:label>
</xp:td>
<xp:td styleClass="tdCls" style="width:8.0%">
<xp:label id="ApeGrade">
<xp:this.value><![CDATA[#{javascript://return apprDoc.getItemValueString("Appraisee_Grade");
return appraisalDoc.getItemValueString("Appraisee_Grade");}]]></xp:this.value>
</xp:label>
</xp:td>
<xp:td styleClass="tdCls" style="width:15.0%">
<xp:div style="text-align:center">
<xp:label id="appeTotImpRate"
style="font-size:10pt;color:rgb(255,0,0);font-weight:bold">
<xp:this.value><![CDATA[#{javascript://return apprDoc.getItemValueDouble("AppeTotImpRate").toFixed(2);
return appraisalDoc.getItemValueDouble("AppeTotImpRate").toFixed(2);}]]></xp:this.value>
</xp:label>
</xp:div>
</xp:td>
<xp:td styleClass="tdCls" style="width:15.0%">
<xp:div style="text-align:center">
<xp:label id="apprTotImpRate"
style="color:rgb(255,0,0);font-size:10pt;font-weight:bold">
<xp:this.value><![CDATA[#{javascript://return apprDoc.getItemValueDouble("ApprTotImpRate").toFixed(2);
return appraisalDoc.getItemValueDouble("ApprTotImpRate").toFixed(2);}]]></xp:this.value>
</xp:label>
</xp:div>
</xp:td>
<xp:td styleClass="tdCls" style="width:15.0%">
<xp:div style="text-align:center">
<xp:label id="revTotImpRate"
style="font-size:10pt;color:rgb(255,0,0);font-weight:bold">
<xp:this.value><![CDATA[#{javascript://return apprDoc.getItemValueDouble("RevTotImpRate").toFixed(2);
return appraisalDoc.getItemValueDouble("RevTotImpRate").toFixed(2);}]]></xp:this.value>
</xp:label>
</xp:div>
</xp:td>
<xp:td styleClass="tdCls" style="width:12.0%">
<xp:div
style="font-size:10pt;color:rgb(255,0,0);font-weight:bold;text-align:center">
<xp:comboBox id="apprGrades" style="width:50.0px"
disableClientSideValidation="true" value="#{appraisalDoc.ApperFinalGrade}"
readonly="true">
<xp:selectItem itemLabel="-" itemValue=""
id="selectItem1">
</xp:selectItem>
<xp:selectItem itemLabel="1" itemValue="1"
id="selectItem2">
</xp:selectItem>
<xp:selectItem itemLabel="2" itemValue="2"
id="selectItem3">
</xp:selectItem>
<xp:selectItem itemLabel="3" itemValue="3"
id="selectItem4">
</xp:selectItem>
<xp:selectItem itemLabel="4" itemValue="4"
id="selectItem5">
</xp:selectItem>
<xp:selectItem itemLabel="5" itemValue="5"
id="selectItem6">
</xp:selectItem>
</xp:comboBox>
</xp:div>
</xp:td>
<xp:td styleClass="tdCls" style="width:12.0%">
<xp:div
style="font-size:10pt;color:rgb(255,0,0);font-weight:bold;text-align:center">
<xp:comboBox id="ApperRelativeRank" style="width:50.0px"
disableClientSideValidation="true" value="#{appraisalDoc.ApperRelativeRank}">
<xp:this.readonly><![CDATA[#{javascript:/*if(compositeData.UserRole == "Appraiser"){
return true;
}
if(parseInt(appraisalDoc.getValue("CurrFGRRStatus")) >= parseInt(compositeData.compStatus)){
return true;
}*/
return false;}]]></xp:this.readonly>
<xp:this.rendered><![CDATA[#{javascript:/*if(compositeData.UserRole == "Appraiser"){
return false;
}*/
return true;}]]></xp:this.rendered>
<xp:selectItem itemLabel="-" itemValue=""
id="selectItem13">
</xp:selectItem>
<xp:selectItems>
<xp:this.value><![CDATA[#{javascript:// Look up the employee details view to get the employee appraisal details from the current database
var curDB:NotesDatabase = session.getCurrentDatabase();
var vwlkApprView:NotesView = curDB.getView("vwlkCWLApprAllFGCompAppr");
var cwlCluster = appraisalDoc.getItemValueString("AppraiseeCWLCluster");
var collEntAppr:NotesViewEntryCollection = vwlkApprView.getAllEntriesByKey(sessionScope.key + cwlCluster);
var entCount = collEntAppr.getCount()
if(entCount != 0){
var ranks = new Array();
var rankValue, rankLabel;
for(i=0;i<entCount;i++){
rankValue = i + 1;
rankLabel = rankValue + "/" + entCount;
ranks.push(rankLabel + "|" + rankValue);
}
return ranks;
}
return null;}]]></xp:this.value>
</xp:selectItems>
</xp:comboBox>
</xp:div>
</xp:td>
</xp:tr>
</xp:panel>
</xp:repeat>
=parseInt(复合数据compStatus)){
返回true;
}*/
返回false;}]>
您可以访问面板的数据源,请参见示例代码
但这只解决了一半的问题,您需要一个手柄来连接中继器内的每个面板。
您可以在openNTF上找到XPages API浏览器(我目前不知道确切的名称)。这样,您就可以在运行时检查repeat的控件,并检查方法和属性。我打赌有东西可以得到中继器内部的组件 从OpenNTF安装XPage调试工具栏,将其添加到页面并打开Inspector选项卡。这允许您在运行时检查页面上的所有控件(及其方法和属性)。可能会帮助您到达您想要的位置。如果您想先试用,这里有一个在线演示:。感谢Julian和Mark的建议。我几乎达到了我想要的目标。我使用了Brad Balassaitis建议的另一个工作环境来访问重复中的面板。我将尝试调试工具栏,了解重复控制方法和属性,这可能是实现相同目标的更好方法。目前我不了解的是,为什么您希望从重复外部访问文档数据。有什么反对内联编辑的理由吗除此之外,您的代码示例看起来太复杂了:我不明白为什么要从一个视图构建一个文档集合,然后迭代该集合以构建一个数组,然后将该数组馈送给repeat。为什么不直接使用视图数据源?但是也许我不明白这个用例。嗨,谢谢你的回复。我同意可能有更好的方法来实现这一点,但我对xPages比较陌生。我将尝试解释我想要什么,也许你可以建议一个更好的解决方案:我的数据库中有一个文档列表,我需要根据登录用户的角色进行筛选和显示。例如,如果考核人登录,他应该只能看到层次结构中他下面列出的考核人。不仅如此,他还应该能够按照姓名、等级和名称对员工进行排序,并使用组合框列表值(1到5)对他们进行评级。