在beforePageLoad事件中设置组合框的值

时间:2014-05-09 15:01:28

标签: javascript arrays xpages

我在视图中有一个名为"添加行项目"的按钮。选择文档,然后单击此按钮。目的是我们创建一个新文档,其中所选文档的值被填充到新文档中。

在视图按钮中,我使用长字符串设置了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>

2 个答案:

答案 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"));
    }
}