我在视图中有一个名为"添加行项目"的按钮。选择文档,然后单击此按钮。目的是我们创建一个新文档,其中所选文档的值被填充到新文档中。
在视图按钮中,我使用长字符串设置了sessionScope变量。我用"〜"来界定每个条目。在每个条目中,第一个是字段的实际名称。接下来是该领域的价值。这两个由管道" |"分隔。如果字段的实际值是一个数组,它们自然会用分号分隔它们。我提到了所有这些,所以可以理解以下代码。
在我启动的表单中,在beforePageLoad事件中,我有以下内容;
var AddingNewLine = sessionScope.get("AddingNewLine");
if (AddingNewLine != null) {
fieldsArray = AddingNewLine.split("~"); // make an array that has the field names & its value(s)
for (i = 0 ; i < fieldsArray.length ; i++) {
splitValue = fieldsArray[i].split("|"); // now we make an array out of the entry. value 0 will be
fieldName = splitValue[0]; // the name of the field. value 1 will be the values which
fieldValues = splitValue[1].split(";") // in turn will be split into an array
var f = "PayRates:HourlyRates:CPrompts:IssuingCountry:ServiceCurrency:ReceivedDate:InvoiceDate:Client:InvoiceNumber:WBS";
if (f.search(fieldName) >= 0) {
currentDocument.setValue(fieldName,fieldValues);
if (fieldName == "CPrompts") { var CPrompts = fieldValues }
}
}
// new doc but adding new line item or replicating? then get our prompts from the original doc
for (i = 0; i < CPrompts.length ; i++) {sessionScope.put("CPrompt"+(i+1),CPrompts[i])}
}
注意:我用&#34; f&#34;筛选出数值。因为我和他们有不同的问题,现在变量
无论如何,我的所有文本框都在更新,但组合框不是(这恰好是IssuingCountry,ServiceCurrency,Client和WBS。
我在执行currentDocument.setValue时验证了字段名称及其值与print语句是否正确。我甚至试过做一个currentDocument.replaceItemVale。似乎都不适用于comboBox类型字段。这也适用于日期值字段。
Combobox字段示例:
<xp:comboBox
id="IssuingCountry"
style="width:160.0px"
value="#{FInvoiceDoc.IssuingCountry}">
<xp:selectItem
itemLabel="United States of America"
itemValue="United States of America"
id="selectItem1">
</xp:selectItem>
<xp:selectItems id="selectItems1">
<xp:this.value>
<![CDATA[#{javascript:@DbLookup("", "Keywords", "Countries", 2)}]]>
</xp:this.value>
</xp:selectItems>
</xp:comboBox>
难道我需要以某种方式更新itemLabel吗?如果是这样,怎么样?
日期字段示例;
<xp:inputText
value="#{FInvoiceDoc.ReceivedDate}"
id="ReceivedDate"
style="width:85px">
<xp:this.converter>
<xp:convertDateTime
pattern="MM/dd/yyyy">
</xp:convertDateTime>
</xp:this.converter>
<xp:dateTimeHelper
id="dateTimeHelper1">
</xp:dateTimeHelper>
</xp:inputText>
答案 0 :(得分:2)
会话范围可以处理复杂对象。创建字符串会降低可维护性。我会创建这样的东西:
var prepopulate = [];
prepopulate.push({ "name" : "IssuingCountry", value : "United Stated of America"});
prepopulate.push({ "name" : "ReceivedDate", value : [date1, date2]);
sessionScope.AddingNewLine = prepopulate;
然后是afterPageLoad
(在renderResponse
之前运行)你做这样的事情(省略了对有效字段名称的测试):
if (!sessionScope.AddingNewLine) {
return;
}
var prepopulate = sessionScope.AddingNewLine;
for( var i = 0; i < prepopulate.length; i++ ) {
var oneItem = prepopulate[i];
FInvoiceDoc.setValue(oneItem.name, oneItem.value);
}
// reset
sessionScope.AddingNewLine = null;
所以两个重要的区别:使用afterPageLoad并使用复杂对象,而不是野生字符串。您可能希望使用对象而不是数组,因为您对CPrompts有特殊用途。
你在条件中声明一个变量。只有JS不使用块级变量这一事实才能防止代码在您的字符串中没有CPrompts时失败。所以复杂的对象可能是:
var prepopulate = {};
prepopulate.cprompts = ["some","prompts"];
prepopulate.fields = [];
prepopulate.fields.push(....);
希望有所帮助
答案 1 :(得分:1)
或者您可以在参数中为所选文档的UNID提供类似的内容:
context.redirectToPage( "issue.xsp?action=newDocument&parentId=" + selectedUNID );
并在beforePageLoad中,检索parentDoc以获取所需的所有字段
if (dataDoc.isNewNote()) {
var sParentId = dataDoc.getParentId();
if (sParentId != null) {
var parentDoc:NotesDocument = database.getDocumentByUNID(sParentId);
dataDoc.setValue("KeyParent", parentDoc.getItemValueString("KeyDoc"));
dataDoc.setValue("Domain", parentDoc.getItemValueString("Domain"));
}
}