将范围变量转换为简单数据绑定

时间:2016-02-17 10:28:32

标签: xpages

关于这篇文章:Scoped Variable in List Box。我有一个问题 将范围变量转换为简单数据绑定。

有一个组合框,两个列表框和两个按钮。这两个列表框可以通过单击相关按钮来交换值。列表框值与组合框值相关。例如,用户从组合框中选择一个值(例如2),然后用户可以从列表框A中选择移动值到列表框B,反之亦然。

如果我想存储这些值(组合框值和列表框值),我需要一个按钮并创建一个表单和一个视图来存储它们。

在阅读Paul Stephen Withers的回答后,我选择使用replaceItemValue然后调用save()。我在互联网上搜索如何使用replaceItemValue,最后我可以保存列表框A,列表框B和组合框的值。我可以在视图中看到保存的值。

代码是这样的:

document1.replaceItemValue("BListBoxField", viewScope.BselectItems)+ document1.replaceItemValue("AListBoxField", viewScope.AselectItems)+document1.replaceItemValue("ComboBoxField", comboBoxValue);
document1.save();

我需要检索取决于组合框值的值,我有以下操作:

在组合框中,我选择onchange事件,在服务器选项中,我选择部分更新和我需要更新的元素。 (在我的情况下,我选择部分更新表,因为列表框A和B都位于那里)

在列表框B中,我需要相关值取决于组合框值,所以我使用DbLookup来查找值。因此,在脚本编辑器中,我编写以下代码:

var comboBoxValue = getComponent("comboBox4").getValue();
if ((comboBoxValue == null) || (null == comboBoxValue))
{ return "No value here";}
else if ((comboBoxValue != null) || (null != comboBoxValue))
{ 
    var lookUpComboBoxValue = @DbLookup(@DbName(),"ViewName", comboBoxValue,3  )
return  lookUpComboBoxValue;
}

viewScope.BselectItems  = lookUpComboBoxValue;
   if (!viewScope.BselectItems) {
                        viewScope.BselectItems = [];
                    }
                    return viewScope.BselectItems;

在列表框A中,它类似于列表框B,代码如下:

var comboBoxValue = getComponent("comboBox4").getValue();
if ((comboBoxValue == null) || (null == comboBoxValue))
{ return "No value here";}
else if ((comboBoxValue != null) || (null != comboBoxValue))
{ 
 var lookUpComboBoxValue = @DbLookup(@DbName(),"ViewName", comboBoxValue,3 )
 return  lookUpComboBoxValue;
}

viewScope.AselectItems  = lookUpComboBoxValue;
   if (!viewScope.AselectItems) {
         viewScope.AselectItems = [];
    }
    return viewScope.AselectItems;

我运行代码并在组合框中选择“2”,列表框可​​以检索与“2”相关的值。

但是如果我移动列表框中的值,我会得到异常:'viewScope.AselectItems'为空。它突出显示触发异常的代码:

viewScope.AselectItems.remove(sel[i]);

我查看代码,我猜错误出现在列表框中,而不是按钮中的代码。我认为这部分是我有错误的原因,因为如果删除代码的那部分,就不会发生异常:

viewScope.BselectItems  = lookUpComboBoxValue;
if (!viewScope.BselectItems) {
                        viewScope.BselectItems = [];
                    }
                    return viewScope.BselectItems;

要解决此异常,我发现此帖子How can I know if a viewScope variable has been initialized很有用。

我将此代码添加到列表框

if(viewScope.containsKey(BselectItems )){
                                viewScope.BselectItems .add(sel[i]);
                            }
                            else
                            {
                                return "not contains key"
                            }

我仍然得到例外

[ReferenceError] 'BselectItems' not found

此时,问题似乎又回到了问题,我是否需要将范围变量转换为简单的数据绑定?

对于保存值,我可以使用replaceItemValue来保存值。保存该值后,如果需要检索该值,我可以使用DbLookup查找该值。但是如何使查找值在列表框之间变得可以交换?

感谢您的建议。谢谢。

参考文献:

https://www-10.lotus.com/ldd/ddwiki.nsf/dx/10082008104832AMDOCKD8.htm

https://www-10.lotus.com/ldd/ddwiki.nsf/dx/xpages-scoped-variables.htm

1 个答案:

答案 0 :(得分:0)

我没有建立类似的东西,所以我没有一个完整的分步方法。

但是,在制定实现目标的方法时,有一些重要的概念需要理解。如果你已经理解了它们,请原谅我,但是从这个问题和类似的问题开始,我不确定。

  • 任何可编辑组件的value属性确定应从中检索和存储值的位置。它是绑定到存储和加载值的位置,而不是组件的可见值。因此,正如您所说,如果您想将值保存到文档中,则需要例如#{document1.myField}
  • 可编辑组件的defaultValue属性允许您设置组件的初始值。但是,请记住,这将被value属性中的值绑定覆盖。如果要指定覆盖值绑定的用户可见的值,请转到该数据源并在那里设置值(例如#{javascript:document1.replaceItemValue("myValueField", "my new value")}
  • selectItems属性确定可供选择的选项。它并不表示它们是否被选中。因此,如果您只是添加到selectItems而没有实际选择它们,则没有选择要保存的内容。您可以与组件本身进行交互以更新所选值,但更可取的是与value属性中定义的数据存储位置进行交互。

我强烈建议您远离Submit按钮类型和saveDocument简单操作。无论您是否打算,前者都会保存您页面上的所有非只读数据源。后者只会调用一个保存。

一个选项是将绑定保留给viewScope变量,然后在按钮SSJS脚本中使用replaceItemValue将viewScope变量写入document1数据源,然后调用save()。< / p>