关于这篇文章: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
答案 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>